Branching 45.0.2454.104 git-svn-id: https://src.chromium.org/blink/branches/dart/2454_1@202742 bbb929c8-8fbe-4397-9dbb-9b2b20218538 
diff --git a/ManualTests/.gitattributes b/ManualTests/.gitattributes new file mode 100644 index 0000000..379f2f5 --- /dev/null +++ b/ManualTests/.gitattributes 
@@ -0,0 +1,7 @@ +DOMContextMenuEvent.html -crlf +cursor-max-size.html -crlf +drag-with-div-or-image-as-data-image.html -crlf +empty-script-crash.html -crlf +remove-form-node-with-radio-buttons-crash.html -crlf +select-delete-item.html -crlf +textarea-caret-position-after-auto-spell-correct.html -crlf 
diff --git a/ManualTests/ATSU-bad-layout.html b/ManualTests/ATSU-bad-layout.html new file mode 100644 index 0000000..ab725cb --- /dev/null +++ b/ManualTests/ATSU-bad-layout.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=9808">Bugzilla bug 9808</a> REGRESSION: Incorrect layout (and ERROR) when forcing ATSU For All Text</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Choose <i>Use ATSU For All Text</i> from Safari&rsquo;s <i>Debug</i> menu and reload this page. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The text &ldquo;Lorem ipsum&rdquo; below will remain on one line. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +There will be a line break after &ldquo;Lorem&rdquo; (and at many other places on this page). +</p> + +<span>Lorem</span> ipsum + +</body> +</html> 
diff --git a/ManualTests/DOMContextMenuEvent.html b/ManualTests/DOMContextMenuEvent.html new file mode 100644 index 0000000..ab1998f --- /dev/null +++ b/ManualTests/DOMContextMenuEvent.html 
@@ -0,0 +1,56 @@ +<html> +<script type="text/javascript"> + +function context_event(event) +{ + if (window.event) + { + event = window.event; + } + var swallow = document.getElementById("swallow_context").checked; + + var str = + "EVENT PROPERTIES<br>" + + "cancelable = "+event.cancelable+"<br>" + + "ctrlKey = "+event.ctrlKey+"<br>" + + "metaKey = "+event.metaKey+"<br>" + + "shiftKey = "+event.shiftKey+"<br>" + + "<br>" + + "TEST PROPERTIES<br>" + + "prevent default = "+swallow+"<br>" + + "event time = "+new Date()+"<br>" + + ""; + document.getElementById("event_info").innerHTML=str; + + if (swallow) + { + if ((typeof event.cancelBubble) != "undefined") + event.cancelBubble=true; + + if ((typeof event.preventDefault) != "undefined") + event.preventDefault(); + + if ((typeof event.returnValue) != "undefined") + event.returnValue = false; + + if ((typeof event.stopPropagation) != "undefined") + event.stopPropagation(); + + return false; + } + + return true; +} + +</script> + +<body oncontextmenu="return context_event(event)"> +<div>To activate context menu, right-click or ctrl-click anywhere on the page.</div> +<div>&nbsp;</div> +<div><input type="checkbox" value="1" name="swallow_context" id="swallow_context"> Prevent default context menu</div> +<div>&nbsp;</div> +<tt id="event_info" style='background-color:#eeeeee'> + -- No event captured -- +</tt> +</body> +</html> 
diff --git a/ManualTests/Default-port-frame.html b/ManualTests/Default-port-frame.html new file mode 100644 index 0000000..660947d --- /dev/null +++ b/ManualTests/Default-port-frame.html 
@@ -0,0 +1,12 @@ +To run this test you will need to put this file and Default-port-frame-contents.html +on a webserver and then point your browser to http://localhost/Default-port-frame.html. +We cannot make this a LayoutTest because we don't want to mess with people's default ports. +<br> +<iframe src="http://localhost:80/resources/Default-port-frame-contents.html"> </iframe> +<script> + function test() { + var result = typeof frames[0].testData != 'undefined'; + alert(result ? 'Success' : 'Failed'); + } +</script> +<input type="button" onclick="test()" value="Click Me To Test" ></input> \ No newline at end of file 
diff --git a/ManualTests/JavaScript-bookmarklets.html b/ManualTests/JavaScript-bookmarklets.html new file mode 100644 index 0000000..0b71f6f --- /dev/null +++ b/ManualTests/JavaScript-bookmarklets.html 
@@ -0,0 +1,55 @@ +<script> +var arr = new Array("var%20x=' ';", // Space %20 + "var%20x='#';", // # %23 + "var%20x='$';", // $ %24 + "var%20x='%';", // % %25 + "var%20x='&';", // & %26 + "var%20x='/';", // / %2F + "var%20x=':';", // : %3A + "var%20x=';';", // ; %3B + "var%20x='<';", // < %3C + "var%20x='=';", // = %3D + "var%20x='>';", // > %3E + "var%20x='?';", // ? %3F + "var%20x='@';", // @ %40 + "var%20x='[';", // [ %5B + "var%20x='\\';", // \ %5C + "var%20x=']';", // ] %5D + "var%20x='^';", // ^ %5E + "var%20x='`';", // ' %60 + "var%20x='{';", // { %7B + "var%20x='|';", // | %7C + "var%20x='}';", // } %7D + "var%20x='~';"); // ~ %7E + +  +function makeLinks() +{ + var str = "javascript:"; + var anchor, anchorText; + for (key in arr) + { + anchor = document.createElement("a"); + anchor.setAttribute("href", str+arr[key]); + anchorText = document.createTextNode(arr[key]); + anchor.appendChild(anchorText); + document.body.appendChild(anchor); + document.body.appendChild(document.createElement("br")); + } +} + +</script> +<body onload="makeLinks();"> +This test is for <a href="rdar://problem/5310312">rdar://problem/5310312</a> and can be run manually only.<br> +<a href="rdar://problem/5379908">rdar://problem/5379908</a> tracks the effort to enhance DRT to make this into a layout test.<br> +<br> +<b>Directions:</b> +<ol> +<li> drag each link below to the bookmarks bar to create bookmarks +<li> open the JavaScript console (in the debug menu) +<li> click on all the bookmarks you've just created +</ol> +<b>Expected results:</b> +no parse errors in the JavaScript console<br> +<br> +</body> \ No newline at end of file 
diff --git a/ManualTests/NPN_Invoke/main.c b/ManualTests/NPN_Invoke/main.c new file mode 100644 index 0000000..b726b72 --- /dev/null +++ b/ManualTests/NPN_Invoke/main.c 
@@ -0,0 +1,265 @@ +/* + IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in + consideration of your agreement to the following terms, and your use, installation,  + modification or redistribution of this Apple software constitutes acceptance of these  + terms. If you do not agree with these terms, please do not use, install, modify or  + redistribute this Apple software. +  + In consideration of your agreement to abide by the following terms, and subject to these  + terms, Apple grants you a personal, non-exclusive license, under Apple's copyrights in + this original Apple software (the "Apple Software"), to use, reproduce, modify and  + redistribute the Apple Software, with or without modifications, in source and/or binary  + forms; provided that if you redistribute the Apple Software in its entirety and without  + modifications, you must retain this notice and the following text and disclaimers in all  + such redistributions of the Apple Software. Neither the name, trademarks, service marks  + or logos of Apple Computer, Inc. may be used to endorse or promote products derived from  + the Apple Software without specific prior written permission from Apple. Except as expressly + stated in this notice, no other rights or licenses, express or implied, are granted by Apple + herein, including but not limited to any patent rights that may be infringed by your  + derivative works or by other works in which the Apple Software may be incorporated. +  + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES,  + EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,  + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS  + USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. +  + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL  + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS  + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,  + REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND  + WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR  + OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import <WebKit/npapi.h> +#import <WebKit/npfunctions.h> +#import <WebKit/npruntime.h> + +NPNetscapeFuncs *browser; + +NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved); +NPError NPP_Destroy(NPP instance, NPSavedData** save); +NPError NPP_SetWindow(NPP instance, NPWindow* window); +NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype); +NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason); +int32_t NPP_WriteReady(NPP instance, NPStream* stream); +int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer); +void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname); +void NPP_Print(NPP instance, NPPrint* platformPrint); +int16_t NPP_HandleEvent(NPP instance, void* event); +void NPP_URLNotify(NPP instance, const char* URL, NPReason reason, void* notifyData); +NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value); +NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value); + +#pragma export on +// Mach-o entry points +NPError NP_Initialize(NPNetscapeFuncs *browserFuncs); +NPError NP_GetEntryPoints(NPPluginFuncs *pluginFuncs); +void NP_Shutdown(void); +// For compatibility with CFM browsers. +int main(NPNetscapeFuncs *browserFuncs, NPPluginFuncs *pluginFuncs, NPP_ShutdownProcPtr *shutdown); +#pragma export off + + +typedef void (* FunctionPointer) (void); +typedef void (* TransitionVector) (void); +static FunctionPointer functionPointerForTVector(TransitionVector); +static TransitionVector tVectorForFunctionPointer(FunctionPointer); + +// Mach-o entry points +NPError NP_Initialize(NPNetscapeFuncs* browserFuncs) +{ + browser = browserFuncs; + return NPERR_NO_ERROR; +} + +NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) +{ + pluginFuncs->version = 11; + pluginFuncs->size = sizeof(pluginFuncs); + pluginFuncs->newp = NPP_New; + pluginFuncs->destroy = NPP_Destroy; + pluginFuncs->setwindow = NPP_SetWindow; + pluginFuncs->newstream = NPP_NewStream; + pluginFuncs->destroystream = NPP_DestroyStream; + pluginFuncs->asfile = NPP_StreamAsFile; + pluginFuncs->writeready = NPP_WriteReady; + pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write; + pluginFuncs->print = NPP_Print; + pluginFuncs->event = NPP_HandleEvent; + pluginFuncs->urlnotify = NPP_URLNotify; + pluginFuncs->getvalue = NPP_GetValue; + pluginFuncs->setvalue = NPP_SetValue; +  + return NPERR_NO_ERROR; +} + +void NP_Shutdown(void) +{ + +} +  +// For compatibility with CFM browsers. +int main(NPNetscapeFuncs *browserFuncs, NPPluginFuncs *pluginFuncs, NPP_ShutdownProcPtr *shutdown) +{ + browser = malloc(sizeof(NPNetscapeFuncs)); + bzero(browser, sizeof(NPNetscapeFuncs)); +  + browser->size = browserFuncs->size; + browser->version = browserFuncs->version; +  + // Since this is a mach-o plugin and the browser is CFM because it is calling main, translate + // our function points into TVectors so the browser can call them. + browser->geturl = (NPN_GetURLProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->geturl); + browser->posturl = (NPN_PostURLProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->posturl); + browser->requestread = (NPN_RequestReadProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->requestread); + browser->newstream = (NPN_NewStreamProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->newstream); + browser->write = (NPN_WriteProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->write); + browser->destroystream = (NPN_DestroyStreamProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->destroystream); + browser->status = (NPN_StatusProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->status); + browser->uagent = (NPN_UserAgentProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->uagent); + browser->memalloc = (NPN_MemAllocProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->memalloc); + browser->memfree = (NPN_MemFreeProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->memfree); + browser->memflush = (NPN_MemFlushProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->memflush); + browser->reloadplugins = (NPN_ReloadPluginsProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->reloadplugins); + browser->geturlnotify = (NPN_GetURLNotifyProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->geturlnotify); + browser->posturlnotify = (NPN_PostURLNotifyProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->posturlnotify); + browser->getvalue = (NPN_GetValueProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->getvalue); + browser->setvalue = (NPN_SetValueProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->setvalue); + browser->invalidaterect = (NPN_InvalidateRectProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->invalidaterect); + browser->invalidateregion = (NPN_InvalidateRegionProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->invalidateregion); + browser->forceredraw = (NPN_ForceRedrawProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->forceredraw); + browser->getJavaEnv = (NPN_GetJavaEnvProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->getJavaEnv); + browser->getJavaPeer = (NPN_GetJavaPeerProcPtr)functionPointerForTVector((TransitionVector)browserFuncs->getJavaPeer); +  + pluginFuncs->version = 11; + pluginFuncs->size = sizeof(pluginFuncs); + pluginFuncs->newp = (NPP_NewProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_New); + pluginFuncs->destroy = (NPP_DestroyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_Destroy); + pluginFuncs->setwindow = (NPP_SetWindowProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_SetWindow); + pluginFuncs->newstream = (NPP_NewStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_NewStream); + pluginFuncs->destroystream = (NPP_DestroyStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_DestroyStream); + pluginFuncs->asfile = (NPP_StreamAsFileProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_StreamAsFile); + pluginFuncs->writeready = (NPP_WriteReadyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_WriteReady); + pluginFuncs->write = (NPP_WriteProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_Write); + pluginFuncs->print = (NPP_PrintProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_Print); + pluginFuncs->event = (NPP_HandleEventProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_HandleEvent); + pluginFuncs->urlnotify = (NPP_URLNotifyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_URLNotify); + pluginFuncs->getvalue = (NPP_GetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_GetValue); + pluginFuncs->setvalue = (NPP_SetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPP_SetValue); +  + *shutdown = (NPP_ShutdownProcPtr)tVectorForFunctionPointer((FunctionPointer)NP_Shutdown); +  + return NPERR_NO_ERROR; +} + +NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) +{ + // Call window.alert("Success!") + NPError error; + NPObject *windowObject = NULL; + error = browser->getvalue(instance, NPNVWindowNPObject, &windowObject); + if (error == NPERR_NO_ERROR) { + NPVariant alertMessage; + STRINGZ_TO_NPVARIANT("Success!", alertMessage); + NPVariant result; + browser->invoke(instance, windowObject, browser->getstringidentifier("alert"), &alertMessage, 1, &result); + browser->releaseobject(windowObject); + } +  + return NPERR_NO_ERROR; +} + +NPError NPP_Destroy(NPP instance, NPSavedData** save) +{ + return NPERR_NO_ERROR; +} + +NPError NPP_SetWindow(NPP instance, NPWindow* window) +{ + return NPERR_NO_ERROR; +} + +NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype) +{ + *stype = NP_ASFILEONLY; + return NPERR_NO_ERROR; +} + +NPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason) +{ + return NPERR_NO_ERROR; +} + +int32_t NPP_WriteReady(NPP instance, NPStream* stream) +{ + return 0; +} + +int32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer) +{ + return 0; +} + +void NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname) +{ +} + +void NPP_Print(NPP instance, NPPrint* platformPrint) +{ + +} + +int16_t NPP_HandleEvent(NPP instance, void* event) +{ + return 1; +} + +void NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData) +{ + +} + +NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) +{ + return NPERR_GENERIC_ERROR; +} + +NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) +{ + return NPERR_GENERIC_ERROR; +} + +// function pointer converters + +FunctionPointer functionPointerForTVector(TransitionVector tvp) +{ + const uint32_t temp[6] = {0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420}; + uint32_t *newGlue = NULL; +  + if (tvp != NULL) { + newGlue = (uint32_t *)malloc(sizeof(temp)); + if (newGlue != NULL) { + unsigned i; + for (i = 0; i < 6; i++) newGlue[i] = temp[i]; + newGlue[0] |= ((UInt32)tvp >> 16); + newGlue[1] |= ((UInt32)tvp & 0xFFFF); + MakeDataExecutable(newGlue, sizeof(temp)); + } + } +  + return (FunctionPointer)newGlue; +} + +TransitionVector tVectorForFunctionPointer(FunctionPointer fp) +{ + FunctionPointer *newGlue = NULL; + if (fp != NULL) { + newGlue = (FunctionPointer *)malloc(2 * sizeof(FunctionPointer)); + if (newGlue != NULL) { + newGlue[0] = fp; + newGlue[1] = NULL; + } + } + return (TransitionVector)newGlue; +} 
diff --git a/ManualTests/NPN_Invoke/test.html b/ManualTests/NPN_Invoke/test.html new file mode 100644 index 0000000..5164701 --- /dev/null +++ b/ManualTests/NPN_Invoke/test.html 
@@ -0,0 +1,29 @@ +<html> +<head> +<title>NPN_Invoke() test</title> +</head> +<body> + +<object width="0" height="0" type="test/npn-invoke"> + <!-- Fallback content to describe how to run the test -- /> + <p>You do not have the &quot;NPN_Invoke&quot; plugin installed. Before you run this test:</p> + <ol> + <li>Build the included Xcode project, &quot;NPN_Invoke.xcodeproj&quot;.</li> + <li>Copy the built plugin (NPN_Invoke.plugin) to /Library/Internet Plug-Ins.</li> + <li>Restart Safari.</li> + </ol> +</object> + +<p>This tests NPN_Invoke(), part of the Netscape Plugin API scripting interface.</p> +<p>To verify, you must run this test with JavaScript enabled and then repeat the test with JavaScript disabled.</p> + +<h4>JavaScript enabled</h4> +<p style="color: green">Success: An alert dialog is shown with the message &quot;Success!&quot;</p> +<p style="color: red">Failure: No alert dialog is shown, or the message is not &quot;Success!&quot;</p> + +<h4>JavaScript disabled</h4> +<p style="color: green">Success: No alert dialog is shown, and Safari remains open (does not crash).</p> +<p style="color: red">Failure: An alert dialog is shown, or Safari crashes.</p> + +</body> +</html> 
diff --git a/ManualTests/OWNERS b/ManualTests/OWNERS new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/ManualTests/OWNERS 
@@ -0,0 +1 @@ +* 
diff --git a/ManualTests/WebKitSite.webarchive b/ManualTests/WebKitSite.webarchive new file mode 100644 index 0000000..d9f9c88 --- /dev/null +++ b/ManualTests/WebKitSite.webarchive Binary files differ 
diff --git a/ManualTests/about-blank-xhr.html b/ManualTests/about-blank-xhr.html new file mode 100644 index 0000000..8747878 --- /dev/null +++ b/ManualTests/about-blank-xhr.html 
@@ -0,0 +1,10 @@ +<ol> +<li>Create a new tab.</li> +<li>Navigate that tab to about:blank.</li> +<li>Paste the following into the location bar: + <pre>javascript:x = new XMLHttpRequest(); x.open('get', 'http://jquery.com', false); x.send(); alert(x.responseText)</pre> +</li> +<li>Press "Enter".</li> +<li>If you see the contents of jquery.com appear in an alert dialog, something +has gone wrong.</li> +</ol> 
diff --git a/ManualTests/accessibility/java-applet.html b/ManualTests/accessibility/java-applet.html new file mode 100644 index 0000000..5b5fd69 --- /dev/null +++ b/ManualTests/accessibility/java-applet.html 
@@ -0,0 +1,20 @@ +<html> +<body id="body"> + +<applet code="AppletTest.class" width=200 height=140 codebase="resources" name="appletTest"></applet> + +<p>This test checks our support for accessibility of java applets.</p> +<p>To test: (on mac only)  +<ol> + <li>Open Accessibility Inspector. Move mouse onto white area of web area. + <li>Press Cmd+F7 to lock onto the web area. + <li>Click on the "Go To" drop down in the window that appears. + <li>Choose AXChildren and select the AXGroup "Button". + <li>Choose AXChildren again and do the same. + <li>Continue this until you see the AXButton. + <li>If you do not see an AXButton, the test fails. +</ol> +<hr> + +</body> +</html> 
diff --git a/ManualTests/accessibility/resources/AppletTest.class b/ManualTests/accessibility/resources/AppletTest.class new file mode 100644 index 0000000..5e551a3 --- /dev/null +++ b/ManualTests/accessibility/resources/AppletTest.class Binary files differ 
diff --git a/ManualTests/accessibility/resources/AppletTest.java b/ManualTests/accessibility/resources/AppletTest.java new file mode 100644 index 0000000..2c98a32 --- /dev/null +++ b/ManualTests/accessibility/resources/AppletTest.java 
@@ -0,0 +1,44 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Source for a test applet used by layout tests. */ + +import javax.swing.*; + +public class AppletTest extends JApplet {  +  + public void init() {  + + setLayout(null);  + JButton button = new JButton("button");  + JTextField textField = new JTextField("TextField",20);  + + button.setBounds(10,10,100,30);  + textField.setBounds(10,40,100,40);  +  + add(button);  + add(textField);  + }  +} 
diff --git a/ManualTests/accidental-strict-mode.html b/ManualTests/accidental-strict-mode.html new file mode 100644 index 0000000..45ff8b7 --- /dev/null +++ b/ManualTests/accidental-strict-mode.html 
@@ -0,0 +1,13 @@ +<p>This tests for regression against <a href="http://bugs.webkit.org/show_bug.cgi?id=7102">REGRESSION: parse mode gets set to strict after going back from non-HTML content</a></p> + +<ol> +<li> Click on PDF link below. Wait for PDF to fully load. +<li> Click "Back" button once. +<li> Click the link again. +<li> Click "Back" button once. +</ol> + +<p>In the failing case, the thin line above the link will get much thicker. If it remains the same, this test has passed.</p> + +<table width=100% border=0 cellpadding=0 cellspacing=0><tr><td bgcolor=#3366cc><img width=1 height=1 alt=""></td></tr></table> +<div><a href="http://www.irs.gov/pub/irs-pdf/fw4.pdf">http://www.irs.gov/pub/irs-pdf/fw4.pdf</a></div> 
diff --git a/ManualTests/animate-duration.html b/ManualTests/animate-duration.html new file mode 100644 index 0000000..b155c70 --- /dev/null +++ b/ManualTests/animate-duration.html 
@@ -0,0 +1,65 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Overriding Animations</title> + <script src="../../shared/javascript/utils.js" type="text/javascript" charset="utf-8"></script> + <style type="text/css" media="screen"> + + .container { + position: relative; + width: 400px; + height: 120px; + border: 1px solid black; + margin: 10px; + } + .box { + position: relative; + width: 100px; + height: 100px; + margin: 10px; + background-color: blue; + z-index: 0; + -webkit-animation-name: slide; + -webkit-animation-duration: 1s; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-iteration-count: infinite; + }  + + .one { + -webkit-animation-duration: 0s; + } + + .two { + -webkit-animation-duration: 0; + } +  + @-webkit-keyframes slide { + from { transform: translateX(0); } + to { transform: translateX(280px); } + } + + </style> +</head> +<body> + <p>Single anim (should keep animating)</p> + <div class="container" onclick="toggleClassName(this, 'highlighted')"> + <div class="box none"> + </div> + </div> + <p>duration: "0s" (should not animate)</p> + <div class="container" onclick="toggleClassName(this, 'highlighted')"> + <div class="box one"> + </div> + </div> + <p>duration: "0" (should animate since inherits valid duration)</p> + <div class="container" onclick="toggleClassName(this, 'highlighted')"> + <div class="box two"> + </div> + </div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animate-left.html b/ManualTests/animate-left.html new file mode 100644 index 0000000..3ced2ec --- /dev/null +++ b/ManualTests/animate-left.html 
@@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Animation of left property</title> + <style> + div { + position: relative; + left: 100px; + height: 200px; + width: 200px; + background-color: #9bb; + -webkit-animation-name: bounce; + -webkit-animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: ease-in-out; + } +  + @-webkit-keyframes bounce { + from { + left: 100px; + } + to { + left: 300px; + } + } +  + </style> +</head> +<body> + <h1>Animation of 'left' property</h1> + + <p>The element below should bounce 200 pixels left and right continuously</p> +  + <div id="target"> + This element should animate. + </div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animate-none.html b/ManualTests/animate-none.html new file mode 100644 index 0000000..f3e7b22 --- /dev/null +++ b/ManualTests/animate-none.html 
@@ -0,0 +1,207 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> + +<html> + <head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"> + <title>Testing animation-name: none</title> +  + <style type="text/css" media="screen"> + div { + width: 300px; + height: 100px; + margin: 10px; + -webkit-animation-name: 'fail'; + -webkit-animation-duration: 3.5s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear;  + } + + @-webkit-keyframes 'fail' { + from { + transform: rotate(-90deg); + } + to { + transform: rotate(90deg); + } + } + + #box1 { + position: relative; + background-color: blue; + -webkit-animation-name: 'sway1'; + -webkit-animation-duration: 2.5s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear; + } +  + @-webkit-keyframes 'sway1' { + from { + transform: translate(0, 0); + } + to { + transform: translate(200px, 0); + } + } +  + #box2 { + position: relative; + background-color: red; + -webkit-animation-name: 'sway2'; + -webkit-animation-duration: 3s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear; + } +  + @-webkit-keyframes 'sway2' { + from { + transform: translate(0px, 0); + } + to { + transform: translate(200px, 0); + } + } + + #box3 { + position: relative; + background-color: green; + -webkit-animation-name: 'sway3'; + -webkit-animation-duration: 3.5s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear; + } + + @-webkit-keyframes 'sway3' { + from { + transform: translate(0px, 0); + } + to { + transform: translate(200px, 0); + } + } + + #box4 { + position: relative; + background-color: orange; + -webkit-animation-name: 'none'; + -webkit-animation-duration: 3s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear; + } + + #box5 { + position: relative; + background-color: purple; + -webkit-animation-name: 'none'; + -webkit-animation-duration: 3s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: linear; + } + + #box6 { + position: relative; + background-color: blue; + -webkit-animation-name: 'fade', 'sway6'; + -webkit-animation-duration: 3s, 4s; + -webkit-animation-iteration-count: infinite, infinite; + -webkit-animation-direction: alternate, alternate; + -webkit-animation-timing-function: linear, linear; + } + + @-webkit-keyframes 'sway6' { + from { + transform: translate(0px, 0); + } + to { + transform: translate(200px, 0); + } + } + + @-webkit-keyframes 'fade' { + from { + opacity: 1.0; + } + to { + opacity: 0.1; + } + } + + /* set up animation that should never be run */ + @-webkit-keyframes none { + from { + transform: translate(200px, 0) rotate(-90deg); + } + to { + transform: translate(0px, 0) rotate(90deg); + } + } + + </style> + <script type="text/javascript" charset="utf-8"> + function killanims() { + console.log("click"); + var box1 = document.getElementById("box1"); + box1.style.webkitAnimationName = ''; + var box2 = document.getElementById("box2"); + box2.style.webkitAnimationName = 'none'; + var box3 = document.getElementById("box3"); + box3.style.webkitAnimationName = "'none'"; + var box6 = document.getElementById("box6"); + box6.style.webkitAnimationName = "none, 'sway6'"; + } +  + setTimeout(killanims, 2000); + </script> + </head> + <body> +  + <h2>Testing animation: none</h2> +  + <p> + After 2 seconds only the blue rectangles should be + animating. + Any resulting animation + that involves rotation or fading means that this test has FAILED.</p> +  + <div id="box1"> + This rectangle starts with an animation. After 2 seconds a timer + will set the animation-name on the element to '' (the empty string). + The CSS rule should cause the animation to continue. + </div> + + <div id="box2"> + This rectangle starts with an animation. After 2 seconds a timer + will set the animation-name on the element to 'none' (as an identifier). + This should cause the animation to stop. + </div> + + <div id="box3"> + This rectangle starts with an animation. After 2 seconds a timer + will set the animation-name on the element to 'none' (as a string). + This should cause the animation to stop. + </div> + + <div id="box4"> + This rectangle starts with an animation, but animation-name is + set to 'none' (as an identifier). No animation should run. + </div> + + <div id="box5"> + This rectangle starts with an animation, but animation-name is + set to 'none' (as a string). No animation should run. + </div> + + <div id="box6"> + This rectangle starts with two animations. After 2 seconds a timer + will set the animation-name on the fade to 'none'. The other + animation (horizontal) should continue. + </div> +  + </body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animated-canvas-as-background.html b/ManualTests/animated-canvas-as-background.html new file mode 100644 index 0000000..94f1772 --- /dev/null +++ b/ManualTests/animated-canvas-as-background.html 
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> +<head> +<style> +#container { + width: 300px; + height: 300px; + background-image: -webkit-canvas(sourceCanvas); + background-size: 100%; + display: inline-block; +} +</style> +</head> +<body> + <p>This test passes if two green squares are displayed below.</p> + <div> + <div style="display: inline-block"> + <div id="container"></div> + </div> + <div id="canvas-container" style="display: inline-block"></div> + </div> + <script> + var ctx = document.getCSSCanvasContext('2d', 'sourceCanvas', 300, 300); + var canvas = ctx.canvas; + + function asyncDraw2() { + ctx.fillStyle = "green"; + ctx.fillRect(0, 0, 300, 300); + } + + function asyncDraw1() { + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, 300, 300); + window.webkitRequestAnimationFrame(asyncDraw2); + } + + window.webkitRequestAnimationFrame(asyncDraw1); + + document.querySelector('#canvas-container').appendChild(canvas); + </script> +</body> +</html> 
diff --git a/ManualTests/animated-gif-bfcache-crash.html b/ManualTests/animated-gif-bfcache-crash.html new file mode 100644 index 0000000..581a957 --- /dev/null +++ b/ManualTests/animated-gif-bfcache-crash.html 
@@ -0,0 +1,50 @@ +<html> +<script> + +var theWindow; + +function step1() +{ + theWindow = window.open("./resources/containsAnimatedGif.html", "x"); + setTimeout(step2, 100); +} + +function step2() +{ + window.open("about:blank", "x"); + setTimeout(step3, 100); +} + +function step3() +{ + theWindow.close(); + theWindow = window.open("./resources/containsAnimatedGif.html"); + setTimeout(step4, 500); +} + +function step4() +{ + theWindow.close(); + document.getElementById("results").appendChild(document.createTextNode("PASSED")); +} + +</script> + +<body> +<p>This page tests the fix for <br> +<a href="rdar://problem/6978362">rdar://problem/6978362</a> Repro crash animating GIF if previously used in a closed window's back/forward list <br> +<a href="https://bugs.webkit.org/show_bug.cgi?id=26568">Bug 26568</a> <br> +<p>Prerequisites:<br> +<ul><li>run the LayoutTest's webserver (WebKitTools/run-webkit-httpd)</ul> +<p>Then click this button: <input type="button" value="Run test" onclick="step1()"> +<p>Expected results:<br> +<ul> +<li>A window will open, loading a page with an animated gif.</li> +<li>about:blank will be loaded in that window, putting the animated gif in the back/forward cache.</li> +<li>That window will close.</li> +<li>A new window will open, loading that page with the animated gif</li> +<li>No crash means test passed </li> +</ul> +<span style="color:green;" id="results"></span> +</body> +</html> 
diff --git a/ManualTests/animated-gif-looping.html b/ManualTests/animated-gif-looping.html new file mode 100644 index 0000000..7dff13c --- /dev/null +++ b/ManualTests/animated-gif-looping.html 
@@ -0,0 +1,20 @@ +<html> +<body> +<div> + <img src="./resources/animated-infinite.gif"> + <p>This should animate.</p> +</div> +<div> + <img src="./resources/non-animated.gif"> + <p>This should not animate and you should see a cross.</p> +</div +<div> + <img src="./resources/animated-2x.gif"> + <p>This animation should loop 2 times.</p> +</div +<div> + <img src="./resources/animated-10x.gif"> + <p>This animation should loop 10 times.</p> +</div +</body> +</html> 
diff --git a/ManualTests/animated-gif-on-compositing-layer.html b/ManualTests/animated-gif-on-compositing-layer.html new file mode 100644 index 0000000..6a3b926 --- /dev/null +++ b/ManualTests/animated-gif-on-compositing-layer.html 
@@ -0,0 +1,13 @@ +<html><head> +<title>Animated GIF on a compositing layer</title> +<style type="text/css" media="screen"> +.compositing { + top: 0px; + left: 0px; + transform:translateZ(0); +} +</style> +</head><body> +<p>This test checks that a gif animation can run on a compositing layer. The test passes if the gif animation runs.</p> +<img class="compositing" src="./resources/animated-infinite.gif" /> +</body></html> 
diff --git a/ManualTests/animation-with-transition.html b/ManualTests/animation-with-transition.html new file mode 100644 index 0000000..37a7589 --- /dev/null +++ b/ManualTests/animation-with-transition.html 
@@ -0,0 +1,60 @@ +<html> +<head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"> + <title>simple-animation</title> + <style type="text/css" media="screen"> + div { + position: relative; + left: 10px; + top: 10px; + width: 200px; + height: 200px; + background-color: #696; + -webkit-transition: left 5s, top 5s; + } +  + .animate { + -webkit-animation-name: simple; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-fill-mode: backwards; + } +  + @-webkit-keyframes simple { + 50% { + left: 300px; + } + 100% { + left: 80px; + } + } +  +  + </style> + <script type="text/javascript" charset="utf-8"> +  + function doTransition() { + var div = document.querySelector("div"); + div.style.left = "200px"; + } +  + function doAnimation() { + var div = document.querySelector("div"); + div.className = "animate"; + } +  + </script> +</head> +<body> + <p>Testing setting an animation while a transition is running, in the + case where the animation synthesizes the initial keyframe</p> + <p> + Start the transition, then start the animation.</p> + <p> + <a href="https://bugs.webkit.org/show_bug.cgi?id=41188">https://bugs.webkit.org/show_bug.cgi?id=41188</a> + </p> + <button onclick="doTransition();">Transition</button> + <button onclick="doAnimation();">Set Animation</button> +<div></div> +</body> +</html> 
diff --git a/ManualTests/animation/animateColor-by.svg b/ManualTests/animation/animateColor-by.svg new file mode 100644 index 0000000..d528865 --- /dev/null +++ b/ManualTests/animation/animateColor-by.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100' fill='black'> + <animateColor attributeName="fill" by='green' dur='3s' fill='freeze' /> + </rect> + <text x='10' y='120'>The rect should animate from black to green over 3 seconds</text> +</svg> 
diff --git a/ManualTests/animation/animateColor-from-by.svg b/ManualTests/animation/animateColor-from-by.svg new file mode 100644 index 0000000..5d0be05 --- /dev/null +++ b/ManualTests/animation/animateColor-from-by.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100'> + <animateColor attributeName="fill" from='#DD0000' by='#0000DD' dur='3s' fill='freeze' /> + </rect> + <text x='10' y='120'>The rect should animate from red to purple over 3 seconds</text> +</svg> 
diff --git a/ManualTests/animation/animateColor-repeat-indefinite.svg b/ManualTests/animation/animateColor-repeat-indefinite.svg new file mode 100644 index 0000000..c2339f6 --- /dev/null +++ b/ManualTests/animation/animateColor-repeat-indefinite.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100'> + <animateColor attributeName="fill" values='blue; green' dur='2s' repeatCount='indefinite' /> + </rect> + <text x='10' y='120'>The rect should animate from blue to green over 2 seconds, repeatedly.</text> +</svg> 
diff --git a/ManualTests/animation/animateColor-to-from.svg b/ManualTests/animation/animateColor-to-from.svg new file mode 100644 index 0000000..ecd4357 --- /dev/null +++ b/ManualTests/animation/animateColor-to-from.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100'> + <animateColor attributeName="fill" from='blue' to='green' dur='3s' fill='freeze' /> + </rect> + <text x='10' y='120'>The rect should animate from blue to green over 3 seconds</text> +</svg> 
diff --git a/ManualTests/animation/animateColor-to.svg b/ManualTests/animation/animateColor-to.svg new file mode 100644 index 0000000..4a276c6 --- /dev/null +++ b/ManualTests/animation/animateColor-to.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100' fill='blue'> + <animateColor attributeName="fill" to='green' dur='3s' fill='freeze' /> + </rect> + <text x='10' y='120'>The rect should animate from blue to green over 3 seconds</text> +</svg> 
diff --git a/ManualTests/animation/animateColor-values-simple.svg b/ManualTests/animation/animateColor-values-simple.svg new file mode 100644 index 0000000..b512651 --- /dev/null +++ b/ManualTests/animation/animateColor-values-simple.svg 
@@ -0,0 +1,6 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100'> + <animateColor attributeName="fill" values='blue; green' dur='3s' fill='freeze' /> + </rect> + <text x='10' y='120'>The rect should animate from blue to green over 3 seconds</text> +</svg> 
diff --git a/ManualTests/animation/animateMotion-to.svg b/ManualTests/animation/animateMotion-to.svg new file mode 100644 index 0000000..17e2cdc --- /dev/null +++ b/ManualTests/animation/animateMotion-to.svg 
@@ -0,0 +1,8 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100'> + <animateMotion to='100,0' dur='3s' /> + </rect> + <text x='10' y='120'> + The rect should from 0,0 to 100,0 over 3 seconds. + </text>  +</svg> 
diff --git a/ManualTests/animation/animateTransform-keyTimes.svg b/ManualTests/animation/animateTransform-keyTimes.svg new file mode 100644 index 0000000..049a070 --- /dev/null +++ b/ManualTests/animation/animateTransform-keyTimes.svg 
@@ -0,0 +1,11 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect fill='blue' width='100' height='100'> + <animateTransform attributeName="transform" type='translate' values='0,0; 10,0; 100,0' keyTimes='0; .6; 1' dur='3s' fill='freeze' /> + </rect> + <rect fill='none' stroke='orange' x='10' width='100' height='100' /> + <rect fill='none' stroke='green' x='100' width='100' height='100' /> + <text x='10' y='120'> + The rect should from 0,0 to 100,0 over 3 seconds. + <tspan dy='20' x='10'>It should be at the orange at 2 seconds and the green at 3 seconds.</tspan> + </text> +</svg> 
diff --git a/ManualTests/animation/animateTransform-parser.svg b/ManualTests/animation/animateTransform-parser.svg new file mode 100644 index 0000000..4e0dd72 --- /dev/null +++ b/ManualTests/animation/animateTransform-parser.svg 
@@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +animateTransform parsing code coverage for translate, rotate, skewX + +TODO: does not test e/E exponent notation + +--> +<svg xmlns="http://www.w3.org/2000/svg" width="800px" height="600px"> +	<g transform="translate(-90, -90)"> +	<circle fill="none" stroke="black" stroke-width="3" cx="200" cy="200" r="100" /> +	<line x1="200" y1="200" x2="300" y2="200" stroke="red" stroke-width="30" stroke-linecap="round"> +	<animateTransform attributeName="transform" type="rotate" from=" 0, 200, 200" to=" 360, 200, 200" +	dur="5s" /> +	</line> +	<line x1="200" y1="200" x2="300" y2="200" stroke="green" stroke-width="20" stroke-linecap="round"> +	<animateTransform attributeName="transform" type="rotate" from=" 0 200 200" to=" 360 200 200" +	dur="5s" /> +	</line> +	<line x1="200" y1="200" x2="300" y2="200" stroke="blue" stroke-width="10" stroke-linecap="round"> +	<animateTransform attributeName="transform" type="rotate" from=" 0,200,200" to=" 360,200,200" +	dur="5s" /> +	</line> +	<line x1="200" y1="200" x2="300" y2="200" stroke="white" stroke-width="5" stroke-linecap="round"> +	<animateTransform attributeName="transform" type="rotate" from=" 0,+200 +200" to=" 360 +200 +200" +	dur="5s" /> +	</line> +	</g> +	<g transform="translate(300, 10)"> +	<rect fill="none" stroke="black" stroke-width="3" x="0" y="0" width="200" height="200" /> +	<circle fill="red" cx="0" cy="0" r="30"> +	<animateTransform attributeName="transform" type="translate" from="0, 0" to="200, 200" dur="5s" /> +	</circle> +	<circle fill="green" cx="0" cy="0" r="20"> +	<animateTransform attributeName="transform" type="translate" from="0 0" to="200 200" dur="5s" /> +	</circle> +	<circle fill="blue" cx="0" cy="0" r="10"> +	<animateTransform attributeName="transform" type="translate" from="0,0" to="200,200" dur="5s" /> +	</circle> +	<circle fill="yellow" cx="0" cy="0" r="5"> +	<animateTransform attributeName="transform" type="translate" from=" +0,+0" to=" +200 +200" dur="5s" /> +	</circle> +	</g> +	<g transform="translate(10, 300)"> +	<rect fill="none" stroke="black" stroke-width="3" x="0" y="0" width="200" height="200" /> +	<rect fill="red" x="0" y="0" width="40" height="100"> +	<animateTransform attributeName="transform" type="scale" from="1,1" by="0,1" dur="5s" /> +	</rect> +	<rect fill="green" x="0" y="0" width="30" height="100"> +	<animateTransform attributeName="transform" type="scale" from="1 1" by="0 1" dur="5s" /> +	</rect> +	<rect fill="blue" x="0" y="0" width="20" height="100"> +	<animateTransform attributeName="transform" type="scale" from="1, 1" by="0, 1" dur="5s" /> +	</rect> +	<rect fill="yellow" x="0" y="0" width="10" height="100"> +	<animateTransform attributeName="transform" type="scale" from="+1,+1" by=" +0, +1" dur="5s" /> +	</rect> + +	<rect fill="red" x="0" y="0" width="100" height="40"> +	<animateTransform attributeName="transform" type="scale" from="1,1" by="1,0" dur="5s" /> +	</rect> +	<rect fill="green" x="0" y="0" width="100" height="30"> +	<animateTransform attributeName="transform" type="scale" from="1 1" by="1 0" dur="5s" /> +	</rect> +	<rect fill="blue" x="0" y="0" width="100" height="20"> +	<animateTransform attributeName="transform" type="scale" from="1, 1" by="1, 0" dur="5s" /> +	</rect> +	<rect fill="yellow" x="0" y="0" width="100" height="10"> +	<animateTransform attributeName="transform" type="scale" from="+1,+1" by=" +1, +0" dur="5s" /> +	</rect> +	</g> + +	<g transform="translate(300, 300)"> +	<rect fill="none" stroke="black" stroke-width="3" x="0" y="0" width="200" height="200" /> +	<rect fill="red" x="0" y="0" width="100" height="100"> +	<animateTransform attributeName="transform" type="skewX" from="0" by="45" dur="5s" /> +	</rect> +	<rect fill="green" x="0" y="0" width="50" height="100"> +	<animateTransform attributeName="transform" type="skewX" from="0" by=" 45" dur="5s" /> +	</rect> +	<rect fill="blue" x="0" y="0" width="25" height="100"> +	<animateTransform attributeName="transform" type="skewX" from="0" by=" +45.0" dur="5s" /> +	</rect> +	</g> +</svg> + 
diff --git a/ManualTests/animation/animateTransform-repeat-once.svg b/ManualTests/animation/animateTransform-repeat-once.svg new file mode 100644 index 0000000..b1951ba --- /dev/null +++ b/ManualTests/animation/animateTransform-repeat-once.svg 
@@ -0,0 +1,8 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect fill='blue' width='100' height='100'> + <animateTransform attributeName="transform" type='translate' from='0,0' to='100,0' dur='2s' repeatCount='2' fill='freeze' /> + </rect> + <text x='10' y='120'> + The rect should from 0,0 to 100,0 over 2 seconds, twice. + </text> +</svg> 
diff --git a/ManualTests/animation/animateTransform-toanimation.svg b/ManualTests/animation/animateTransform-toanimation.svg new file mode 100644 index 0000000..b15ffd3 --- /dev/null +++ b/ManualTests/animation/animateTransform-toanimation.svg 
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" width="800px" height="600px"> +	<g transform="translate(10, 300)"> +	<rect fill="red" x="0" y="0" width="100" height="100"> +	<animateTransform attributeName="transform" type="scale" to="5" dur="5s" /> +	</rect> +	</g> +</svg> + 
diff --git a/ManualTests/animation/animation-direction-reverse-timing-functions-hardware.html b/ManualTests/animation/animation-direction-reverse-timing-functions-hardware.html new file mode 100644 index 0000000..db8573e --- /dev/null +++ b/ManualTests/animation/animation-direction-reverse-timing-functions-hardware.html 
@@ -0,0 +1,151 @@ +<!doctype html> +<html lang="en"> +<head> + <style> + .wrapper { + margin-bottom: 20px; + } + .wrapper div { + height: 18px; + width: 200px; + color: white; + } + .expected { + background-color: red; + } + .animated { + background-color: green; + /* This timing function has value 0 at inputs of 1/3 and 2/3. Chosen because it's very asymmetric about x = y. */ + -webkit-animation: move 3000000s 2 cubic-bezier(0.333333, 0.333333, 0.666666, -0.833333) forwards; + margin-bottom: 4px; + } + + .delay_zero { + -webkit-animation-delay: 0s; + } + .delay_one_third { + -webkit-animation-delay: -1000000s; + } + .delay_two_thirds { + -webkit-animation-delay: -2000000s; + } + .delay_three_thirds { + -webkit-animation-delay: -3000000s; + } + .delay_four_thirds { + -webkit-animation-delay: -4000000s; + } + .delay_five_thirds { + -webkit-animation-delay: -5000000s; + } + .delay_six_thirds { + -webkit-animation-delay: -6000000s; + } + + .expected { + transform: translateX(100px);  + } + #normal .expected.delay_six_thirds { + transform: translateX(200px); + } + #alternate .expected.delay_three_thirds { + transform: translateX(200px); + } + #reverse .expected.delay_zero, #reverse .expected.delay_three_thirds { + transform: translateX(200px); + } + #alternate-reverse .expected.delay_zero, #alternate-reverse .expected.delay_six_thirds { + transform: translateX(200px); + } + + #normal div { + -webkit-animation-direction: normal; + } + #alternate div { + -webkit-animation-direction: alternate; + } + #reverse div { + -webkit-animation-direction: reverse; + } + #alternate-reverse div { + -webkit-animation-direction: alternate-reverse; + } +  + @-webkit-keyframes move { + from { transform: translateX(100px); } + to { transform: translateX(200px); } + } + </style> +</head> +<body> +<div> + Tests animation direction with timing functions and hardware acceleration. + The green boxes use live animations and each should line up with the red box + immediately above it. +</div> +<div class="wrapper" id="normal"> + <div class="expected delay_zero">normal</div> + <div class="animated delay_zero">normal</div> + <div class="expected delay_one_third">normal</div> + <div class="animated delay_one_third">normal</div> + <div class="expected delay_two_thirds">normal</div> + <div class="animated delay_two_thirds">normal</div> + <div class="expected delay_three_thirds">normal</div> + <div class="animated delay_three_thirds">normal</div> + <div class="expected delay_four_thirds">normal</div> + <div class="animated delay_four_thirds">normal</div> + <div class="expected delay_five_thirds">normal</div> + <div class="animated delay_five_thirds">normal</div> + <div class="expected delay_six_thirds">normal</div> + <div class="animated delay_six_thirds">normal</div> +</div> +<div class="wrapper" id="alternate"> + <div class="expected delay_zero">alternate</div> + <div class="animated delay_zero">alternate</div> + <div class="expected delay_one_third">alternate</div> + <div class="animated delay_one_third">alternate</div> + <div class="expected delay_two_thirds">alternate</div> + <div class="animated delay_two_thirds">alternate</div> + <div class="expected delay_three_thirds">alternate</div> + <div class="animated delay_three_thirds">alternate</div> + <div class="expected delay_four_thirds">alternate</div> + <div class="animated delay_four_thirds">alternate</div> + <div class="expected delay_five_thirds">alternate</div> + <div class="animated delay_five_thirds">alternate</div> + <div class="expected delay_six_thirds">alternate</div> + <div class="animated delay_six_thirds">alternate</div> +</div> +<div class="wrapper" id="reverse"> + <div class="expected delay_zero">reverse</div> + <div class="animated delay_zero">reverse</div> + <div class="expected delay_one_third">reverse</div> + <div class="animated delay_one_third">reverse</div> + <div class="expected delay_two_thirds">reverse</div> + <div class="animated delay_two_thirds">reverse</div> + <div class="expected delay_three_thirds">reverse</div> + <div class="animated delay_three_thirds">reverse</div> + <div class="expected delay_four_thirds">reverse</div> + <div class="animated delay_four_thirds">reverse</div> + <div class="expected delay_five_thirds">reverse</div> + <div class="animated delay_five_thirds">reverse</div> + <div class="expected delay_six_thirds">reverse</div> + <div class="animated delay_six_thirds">reverse</div> +</div> +<div class="wrapper" id="alternate-reverse"> + <div class="expected delay_zero">alternate-reverse</div> + <div class="animated delay_zero">alternate-reverse</div> + <div class="expected delay_one_third">alternate-reverse</div> + <div class="animated delay_one_third">alternate-reverse</div> + <div class="expected delay_two_thirds">alternate-reverse</div> + <div class="animated delay_two_thirds">alternate-reverse</div> + <div class="expected delay_three_thirds">alternate-reverse</div> + <div class="animated delay_three_thirds">alternate-reverse</div> + <div class="expected delay_four_thirds">alternate-reverse</div> + <div class="animated delay_four_thirds">alternate-reverse</div> + <div class="expected delay_five_thirds">alternate-reverse</div> + <div class="animated delay_five_thirds">alternate-reverse</div> + <div class="expected delay_six_thirds">alternate-reverse</div> + <div class="animated delay_six_thirds">alternate-reverse</div> +</div> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-2-keyframe.html b/ManualTests/animation/compositor-animation-2-keyframe.html new file mode 100644 index 0000000..a725209 --- /dev/null +++ b/ManualTests/animation/compositor-animation-2-keyframe.html 
@@ -0,0 +1,66 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has three boxes. +<ul> + <li>Top - runs on the main thread.</li> + <li>Middle - runs on the compositor, timing function set on whole animation.</li> + <li>Bottom - runs on the compositor, timing function set on the first keyframe.</li> +</ul> +The animations should be identical but start at different times. +</p><p> +This test is successful if the boxes are mostly in sync (there might be a small +offset between them). +</p> +<hr> + +Start delay 0s (no start delay, should finish first.) +<br> +<div class='test0 anim-left'></div> +<div class='test0 anim-transform'></div> +<div class='test0 anim-transform-keyframe'></div> + +Start delay 3s (starts 3 seconds after page load, should finish last.) +<br> +<div class='test1 anim-left'></div> +<div class='test1 anim-transform'></div> +<div class='test1 anim-transform-keyframe'></div> + +<script> + document.getElementsByClassName('test0 anim-left')[0].animate( + [{left: '0'}, {left: '300px'}], + {duration: 2000, easing: 'ease-in'}); + + document.getElementsByClassName('test0 anim-transform')[0].animate( + [{transform: 'translateX(0)'}, {transform: 'translateX(300px)'}], + {duration: 2000, easing: 'ease-in'}); + + document.getElementsByClassName('test0 anim-transform-keyframe')[0].animate( + [{transform: 'translateX(0)', easing: 'ease-in'}, {transform: 'translateX(300px)'}], + {duration: 2000}); + + // Delay these manually otherwise won't hit the compositor. + setTimeout(function() { + document.getElementsByClassName('test1 anim-left')[0].animate( + [{left: '0'}, {left: '300px'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + document.getElementsByClassName('test1 anim-transform')[0].animate( + [{transform: 'translateX(0)'}, {transform: 'translateX(300px)'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + document.getElementsByClassName('test1 anim-transform-keyframe')[0].animate( + [{transform: 'translateX(0)', easing: 'cubic-bezier(.5, -1, .5, 2)'}, {transform: 'translateX(300px)'}], + {duration: 2000}); + }, 3000); +</script> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-cubic.html b/ManualTests/animation/compositor-animation-cubic.html new file mode 100644 index 0000000..d69e7b4 --- /dev/null +++ b/ManualTests/animation/compositor-animation-cubic.html 
@@ -0,0 +1,89 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section has below has two boxes. +<ul> + <li>Top - runs on main thread.</li> + <li>Bottom - runs on the compositor, unless otherwise specified.</li> +</ul> +The animations should be identical but start at different times. +</p><p> +This test is successful if the boxes are mostly in sync (there might be a small +offset between them). +</p> +<hr> + +Start delay 0s. +<br> +<div class='test0 anim-left'></div> +<div class='test0 anim-transform'></div> + +Start delay 3s. Bottom does not run on compositor. +<br> +<div class='test1 anim-left'></div> +<div class='test1 anim-transform'></div> + +Start delay 6s. +<br> +<div class='test2 anim-left'></div> +<div class='test2 anim-transform'></div> + +Start delay 9s. +<br> +<div class='test3 anim-left'></div> +<div class='test3 anim-transform'></div> +<script> + document.getElementsByClassName('test0 anim-left')[0].animate( + [{left: '0'}, {left: '300px'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + document.getElementsByClassName('test0 anim-transform')[0].animate( + [{transform: 'translateX(0)'}, {transform: 'translateX(300px)'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + setTimeout(function() { + document.getElementsByClassName('test1 anim-left')[0].animate( + [{left: '0', easing: 'ease-in'}, {left: '300px'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + document.getElementsByClassName('test1 anim-transform')[0].animate( + [{transform: 'translateX(0)', easing: 'ease-in'}, {transform: 'translateX(300px)'}], + {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + }, 3000); + + setTimeout(function() { + document.getElementsByClassName('test2 anim-left')[0].animate( + [{left: '0', easing: 'ease-in'}, {left: '300px'}], + {duration: 2000, easing: 'ease-out'}); + + document.getElementsByClassName('test2 anim-transform')[0].animate( + [{transform: 'translateX(0)', easing: 'ease-in'}, {transform: 'translateX(300px)'}], + {duration: 2000, easing: 'ease-out'}); + }, 6000); + + setTimeout(function() { + document.getElementsByClassName('test3 anim-left')[0].animate([ + {left: '0'}, + {left: '100px', easing: 'ease-in'}, + {left: '200px'}, + {left: '300px'} + ], {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + + document.getElementsByClassName('test3 anim-transform')[0].animate([ + {transform: 'translateX(0)'}, + {transform: 'translateX(100px)', easing: 'ease-in'}, + {transform: 'translateX(200px)'}, + {transform: 'translateX(300px)'} + ], {duration: 2000, easing: 'cubic-bezier(.5, -1, .5, 2)'}); + }, 9000); +</script> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-delay-cancel.html b/ManualTests/animation/compositor-animation-delay-cancel.html new file mode 100644 index 0000000..87730a5 --- /dev/null +++ b/ManualTests/animation/compositor-animation-delay-cancel.html 
@@ -0,0 +1,37 @@ +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> + +Player started then cancel()/finish(). Neither of the boxes should move. +<br> + +<div id="target1"></div> +<div id="target2"></div> + +<script> +var player1 = target1.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(800px)'} +], { + duration: 1000, + delay: 100 +}); + +var player2 = target2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(800px)'} +], { + duration: 1000, + delay: 100 +}); + +setTimeout(function() { + player1.cancel(); + player2.finish(); +}, 10); +</script> 
diff --git a/ManualTests/animation/compositor-animation-delay-playback-rate.html b/ManualTests/animation/compositor-animation-delay-playback-rate.html new file mode 100644 index 0000000..d74ae0e --- /dev/null +++ b/ManualTests/animation/compositor-animation-delay-playback-rate.html 
@@ -0,0 +1,92 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Delay is set to -1s +<br> +<div id="test1a">MT</div> +<div id="test1b">CT</div> + +Delay is 0 +<br> +<div id="test2a">MT</div> +<div id="test2b">CT</div> + +Delay is set to 1s +<br> +<div id="test3a">MT</div> +<div id="test3b">CT</div> + +<script> + var transformKeyframes = [ + {transform: 'translateX(0px)'}, + {transform: 'translateX(500px)'}]; + var leftKeyframes = [ + {left: '0'}, + {left: '500px'}]; + var players = []; + players.push(test1a.animate(leftKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + delay: -1000 + })); + players.push(test1b.animate(transformKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + delay: -1000 + })); + players.push(test2a.animate(leftKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + delay: 0 + })); + players.push(test2b.animate(transformKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + delay: 0 + })); + players.push(test3a.animate(leftKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + delay: 1000 + })); + players.push(test3b.animate(transformKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + delay: 1000 + })); + + setTimeout(function() { + players.forEach(function(player) { + player.playbackRate = 0.5; + }); + }, 500); + setTimeout(function() { + players.forEach(function(player) { + player.playbackRate = 1.5; + }); + }, 1500); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animation/compositor-animation-delay.html b/ManualTests/animation/compositor-animation-delay.html new file mode 100644 index 0000000..089880a --- /dev/null +++ b/ManualTests/animation/compositor-animation-delay.html 
@@ -0,0 +1,90 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + transform: translateZ(0); + -webkit-animation-direction: alternate; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-iteration-count: 6; +} + +.test0 { + -webkit-animation-delay: -30s; +} + +.test1 { + -webkit-animation-delay: -3s; +} + +.test2 { + -webkit-animation-delay: 0s; +} + +.test3 { + -webkit-animation-delay: 3s; +} + +.anim-left { + -webkit-animation-name: anim-left; + z-index: 100; +} + +.anim-transform { + -webkit-animation-name: anim-transform; + z-index: 200; +} + +@-webkit-keyframes anim-left { + 0% { + left: 0px; + } + 100% { + left: 300px; + } +} + +@-webkit-keyframes anim-transform { + 0% { + transform: translateX(0px); + } + 100% { + transform: translateX(300px); + } +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. The animations should be identical but start at different +times. +</p><p> +This test is successful if the boxes are mostly in sync (there might be a small +offset between them). +</p> +<hr> + +Start delay -30s (starts 30 seconds into animation by which the animation has finished, hence no animation) +<br> +<div class='test0 anim-left'></div> +<div class='test0 anim-transform'></div> + +Start delay -3s (starts 3 seconds into the animation, should finish first.) +<br> +<div class='test1 anim-left'></div> +<div class='test1 anim-transform'></div> + +Start delay 0s (no start delay, should finish second.) +<br> +<div class='test2 anim-left'></div> +<div class='test2 anim-transform'></div> + +Start delay 3s (starts 3 seconds after page load, should finish last.) +<br> +<div class='test3 anim-left'></div> +<div class='test3 anim-transform'></div> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-direction.html b/ManualTests/animation/compositor-animation-direction.html new file mode 100644 index 0000000..ac3ab7e --- /dev/null +++ b/ManualTests/animation/compositor-animation-direction.html 
@@ -0,0 +1,91 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + transform: translateZ(0); + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-fill-mode: both; + -webkit-animation-iteration-count: 2; +} + +.normal { + -webkit-animation-direction: normal; +} + +.reverse { + -webkit-animation-direction: reverse; +} + +.alternate { + -webkit-animation-direction: alternate; +} + +.alternate-reverse { + -webkit-animation-direction: alternate-reverse; +} + +.anim-left { + -webkit-animation-name: anim-left; + z-index: 100; +} + +.anim-transform { + -webkit-animation-name: anim-transform; + z-index: 200; +} + +@-webkit-keyframes anim-left { + 0% { + left: 0px; + } + 100% { + left: 300px; + } +} + +@-webkit-keyframes anim-transform { + 0% { + transform: translateX(0px); + } + 100% { + transform: translateX(300px); + } +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. The animations should be identical but start at different +times. +</p><p> +This test is successful if the each pair of boxes are mostly in sync (there +might be a small offset between them). +</p> +<hr> + +Direction normal - forwards twice +<br> +<div class='normal anim-left'></div> +<div class='normal anim-transform'></div> + +Direction reverse - backwards twice +<br> +<div class='reverse anim-left'></div> +<div class='reverse anim-transform'></div> + +Direction alternate - forwards then backwards +<br> +<div class='alternate anim-left'></div> +<div class='alternate anim-transform'></div> + +Direction alternate-reverse - backwards then forwards +<br> +<div class='alternate-reverse anim-left'></div> +<div class='alternate-reverse anim-transform'></div> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-fill.html b/ManualTests/animation/compositor-animation-fill.html new file mode 100644 index 0000000..9538ffa --- /dev/null +++ b/ManualTests/animation/compositor-animation-fill.html 
@@ -0,0 +1,115 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + transform: translateZ(0); + -webkit-animation-direction: alternate; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -webkit-animation-delay: 1s; +} + +.fill-both { + -webkit-animation-fill-mode: both; +} + +.fill-none { + -webkit-animation-fill-mode: none; +} + +.fill-forwards { + -webkit-animation-fill-mode: forwards; +} + +.fill-backwards { + -webkit-animation-fill-mode: backwards; +} + +.anim-left { + -webkit-animation-name: anim-left; + z-index: 100; +} + +.anim-transform { + -webkit-animation-name: anim-transform; + z-index: 200; +} + +@-webkit-keyframes anim-left { + 0% { + left: 250px; + } + 100% { + left: 500px; + } +} + +@-webkit-keyframes anim-transform { + 0% { + transform: translateX(250px); + } + 100% { + transform: translateX(500px); + } +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p> +<hr> + +These boxes should start in the middle and finish at the end (both fill) +<br> +<div class="anim-left fill-both">MT</div> +<div class="anim-transform fill-both">CT</div> + +These boxes should start in the middle and finish at the start (backwards fill) +<br> +<div class="anim-left fill-backwards">MT</div> +<div class="anim-transform fill-backwards">CT</div> + +These boxes appear on the left and jump to the middle and finish at the end (forwards fill) +<br> +<div class="anim-left fill-forwards">MT</div> +<div class="anim-transform fill-forwards">CT</div> + +These boxes appear on the left and jump to the middle and finish at the start (none fill) +<br> +<div class="anim-left fill-none">MT</div> +<div class="anim-transform fill-none">CT</div> + +These boxes appear on the left and jump to the middle and finish at the start (auto fill) +<br> +<div id="leftAuto">MT</div> +<div id="transformAuto">CT</div> + +<script> +var transformKeyframes = [ + {transform: 'translateX(250px)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframes = [ + {left: '250px'}, + {left: '500px'} + ]; +leftAuto.animate(leftKeyframes, { + duration: 2000, + iterations: 1, + fill: 'auto', + delay: 1000 +}); +transformAuto.animate(transformKeyframes, { + duration: 2000, + iterations: 1, + fill: 'auto', + delay: 1000 +}); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animation/compositor-animation-iteration-count.html b/ManualTests/animation/compositor-animation-iteration-count.html new file mode 100644 index 0000000..a6659c2 --- /dev/null +++ b/ManualTests/animation/compositor-animation-iteration-count.html 
@@ -0,0 +1,108 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + transform: translateZ(0); + -webkit-animation-direction: alternate; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-fill-mode: both; +} + +.test0 { + -webkit-animation-iteration-count: 0; +} + +.test1 { + -webkit-animation-iteration-count: 0.5; +} + +.test2 { + -webkit-animation-iteration-count: 1; +} + +.test3 { + -webkit-animation-iteration-count: 1.5; +} + +.test4 { + -webkit-animation-iteration-count: 2; +} + +.test5 { + -webkit-animation-iteration-count: 2.5; +} + +.anim-left { + -webkit-animation-name: anim-left; + z-index: 100; +} + +.anim-transform { + -webkit-animation-name: anim-transform; + z-index: 200; +} + +@-webkit-keyframes anim-left { + 0% { + left: 0px; + } + 100% { + left: 300px; + } +} + +@-webkit-keyframes anim-transform { + 0% { + transform: translateX(0px); + } + 100% { + transform: translateX(300px); + } +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. The animations should be identical but start at different +times. +</p><p> +This test is successful if the boxes are mostly in sync (there might be a small +offset between them). +</p> +<hr> + +Iteration count 0 (should not animate) +<br> +<div class='test0 anim-left'></div> +<div class='test0 anim-transform'></div> + +Iteration count 0.5 (should finish first in the middle) +<br> +<div class='test1 anim-left'></div> +<div class='test1 anim-transform'></div> + +Iteration count 1 (should finish second at the end) +<br> +<div class='test2 anim-left'></div> +<div class='test2 anim-transform'></div> + +Iteration count 1.5 (should finish third in the middle) +<br> +<div class='test3 anim-left'></div> +<div class='test3 anim-transform'></div> + +Iteration count 2 (should finish fourth at the start) +<br> +<div class='test4 anim-left'></div> +<div class='test4 anim-transform'></div> + +Iteration count 2.5 (should finish last in the middle) +<br> +<div class='test5 anim-left'></div> +<div class='test5 anim-transform'></div> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-iteration-start.html b/ManualTests/animation/compositor-animation-iteration-start.html new file mode 100644 index 0000000..f4d6e34 --- /dev/null +++ b/ManualTests/animation/compositor-animation-iteration-start.html 
@@ -0,0 +1,143 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test checks that the compositor and main thread are performing identically +given the same input parameters. This test is successful if each pairing of boxes +are identical and all the boxes sync up and finish at the same time. +</p> +<hr> + +Iteration start is set to 0 +<br> +<div id="test1a">MT</div> +<div id="test1b">CT</div> + +Iteration start is set to 0.4 +<br> +<div id="test2a">MT</div> +<div id="test2b">CT</div> + +Iteration start is set to 0.8 +<br> +<div id="test3a">MT</div> +<div id="test3b">CT</div> + +Iteration start is set to 0, iterations is 3, direction is set to alternate +<br> +<div id="test4a">MT</div> +<div id="test4b">CT</div> + +Iteration start is set to 1, iterations is 3, direction is set to alternate-reverse +<br> +<div id="test5a">MT</div> +<div id="test5b">CT</div> + +Iteration start is set to 1, iterations is 3, direction is set to alternate, playback rate is set to -1 +<br> +<div id="test6a">MT</div> +<div id="test6b">CT</div> + + +<script> +var transformKeyframes = [ + {transform: 'translateX(0px)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframes = [ + {left: '0'}, + {left: '500px'} + ]; +var player1a = test1a.animate(leftKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + }); +var player1b = test1b.animate(transformKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + }); +var player2a = test2a.animate(leftKeyframes, { + duration: 1000, + iterations: 2.6, + fill: 'both', + iterationStart: 0.4, + delay: 400, + }); +var player2b = test2b.animate(transformKeyframes, { + duration: 1000, + iterations: 2.6, + fill: 'both', + iterationStart: 0.4, + delay: 400, + }); +var player3a = test3a.animate(leftKeyframes, { + duration: 1000, + iterations: 2.2, + fill: 'both', + iterationStart: 0.8, + delay: 800, + }); +var player3b = test3b.animate(transformKeyframes, { + duration: 1000, + iterations: 2.2, + fill: 'both', + iterationStart: 0.8, + delay: 800, + }); +var player4a = test4a.animate(leftKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + direction: 'alternate', + }); +var player4b = test4b.animate(transformKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + direction: 'alternate', + }); +var player5a = test5a.animate(leftKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + iterationStart: 1, + direction: 'alternate-reverse', + }); +var player5b = test5b.animate(transformKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + iterationStart: 1, + direction: 'alternate-reverse', + }); +var player6a = test6a.animate(leftKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + iterationStart: 1, + direction: 'alternate', + playbackRate: -1, + }); +var player6b = test6b.animate(transformKeyframes, { + duration: 1000, + iterations: 3, + fill: 'both', + iterationStart: 1, + direction: 'alternate', + playbackRate: -1, + }); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animation/compositor-animation-multiple-timelines.html b/ManualTests/animation/compositor-animation-multiple-timelines.html new file mode 100644 index 0000000..e9bc937 --- /dev/null +++ b/ManualTests/animation/compositor-animation-multiple-timelines.html 
@@ -0,0 +1,51 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: yellow; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Multiple iframes test. +<br> +<div id="test1_blink">BLINK THREAD</div> +<div id="test1_impl">IMPL THREAD</div> +<hr> + +<script> +var leftKeyframes = [ + {left: '100px'}, + {left: '600px'} + ]; +var translateKeyframes = [ + {transform: 'translateX(100px)'}, + {transform: 'translateX(600px)'} + ]; + +var player1_blink = test1_blink.animate(leftKeyframes, { + duration: 5000, + delay: 100, + }); +var player1_impl = test1_impl.animate(translateKeyframes, { + duration: 5000, + delay: 100, + }); +</script> + +<iframe src="compositor-animation-steps.html" style="border: 0; width: 100%; height: 50%">No iframe</iframe> + +<iframe src="compositor-animation-same-property.html" style="border: 0; width: 100%; height: 50%">No iframe</iframe> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-playback-rate-reverse.html b/ManualTests/animation/compositor-animation-playback-rate-reverse.html new file mode 100644 index 0000000..5e39457 --- /dev/null +++ b/ManualTests/animation/compositor-animation-playback-rate-reverse.html 
@@ -0,0 +1,158 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Playback rate is set to -0.5 +<br> +<div id="test0a">MT</div> +<div id="test0b">CT</div> + +Playback rate is set to -1 +<br> +<div id="test1a">MT</div> +<div id="test1b">CT</div> + +Playback rate is set to -2 +<br> +<div id="test2a">MT</div> +<div id="test2b">CT</div> + +Playback rate is set to -1, direction is alternate +<br> +<div id="test3a">MT</div> +<div id="test3b">CT</div> + +Playback rate is set to -1, direction is alternate, iterations is 5 - should finish a second later. +<br> +<div id="test4a">MT</div> +<div id="test4b">CT</div> + +Playback rate is set to -1, direction is alternate-reverse +<br> +<div id="test5a">MT</div> +<div id="test5b">CT</div> + +Playback rate is set to -1, direction is alternate-reverse, iterations is 5 - should finish a second later. +<br> +<div id="test6a">MT</div> +<div id="test6b">CT</div> + +<script> + var transformKeyframes = [ + {transform: 'translateX(0px)'}, + {transform: 'translateX(500px)'} + ]; + var leftKeyframes = [ + {left: '0'}, + {left: '500px'} + ]; + var player0a = test0a.animate(leftKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + playbackRate: -0.5 + }); + var player0b = test0b.animate(transformKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + playbackRate: -0.5 + }); + var player1a = test1a.animate(leftKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + playbackRate: -1 + }); + var player1b = test1b.animate(transformKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + playbackRate: -1 + }); + var player2a = test2a.animate(leftKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + playbackRate: -2 + }); + var player2b = test2b.animate(transformKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + playbackRate: -2 + }); + var player3a = test3a.animate(leftKeyframes, { + duration: 1000, + iterations: 4, + fill: 'both', + playbackRate: -1, + direction: 'alternate' + }); + var player3b = test3b.animate(transformKeyframes, { + duration: 1000, + iterations: 4, + fill: 'both', + playbackRate: -1, + direction: 'alternate' + }); + var player4a = test4a.animate(leftKeyframes, { + duration: 1000, + iterations: 5, + fill: 'both', + playbackRate: -1, + direction: 'alternate' + }); + var player4b = test4b.animate(transformKeyframes, { + duration: 1000, + iterations: 5, + fill: 'both', + playbackRate: -1, + direction: 'alternate' + }); + var player5a = test5a.animate(leftKeyframes, { + duration: 1000, + iterations: 4, + fill: 'both', + playbackRate: -1, + direction: 'alternate-reverse' + }); + var player5b = test5b.animate(transformKeyframes, { + duration: 1000, + iterations: 4, + fill: 'both', + playbackRate: -1, + direction: 'alternate-reverse' + }); + var player6a = test6a.animate(leftKeyframes, { + duration: 1000, + iterations: 5, + fill: 'both', + playbackRate: -1, + direction: 'alternate-reverse' + }); + var player6b = test6b.animate(transformKeyframes, { + duration: 1000, + iterations: 5, + fill: 'both', + playbackRate: -1, + direction: 'alternate-reverse' + }); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animation/compositor-animation-playback-rate.html b/ManualTests/animation/compositor-animation-playback-rate.html new file mode 100644 index 0000000..329cebf --- /dev/null +++ b/ManualTests/animation/compositor-animation-playback-rate.html 
@@ -0,0 +1,82 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Playback rate is set to 0.5 +<br> +<div id="test1a">MT</div> +<div id="test1b">CT</div> + +Playback rate is set to 1 +<br> +<div id="test2a">MT</div> +<div id="test2b">CT</div> + +Playback rate is set to 2 +<br> +<div id="test3a">MT</div> +<div id="test3b">CT</div> + +<script> + var transformKeyframes = [ + {transform: 'translateX(0px)'}, + {transform: 'translateX(500px)'} + ]; + var leftKeyframes = [ + {left: '0'}, + {left: '500px'} + ]; + var player1a = test1a.animate(leftKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + playbackRate: 0.5 + }); + var player1b = test1b.animate(transformKeyframes, { + duration: 1000, + iterations: 2, + fill: 'forwards', + playbackRate: 0.5 + }); + var player2a = test2a.animate(leftKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + playbackRate: 1 + }); + var player2b = test2b.animate(transformKeyframes, { + duration: 1000, + iterations: 4, + fill: 'forwards', + playbackRate: 1 + }); + var player3a = test3a.animate(leftKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + playbackRate: 2 + }); + var player3b = test3b.animate(transformKeyframes, { + duration: 1000, + iterations: 8, + fill: 'forwards', + playbackRate: 2 + }); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/animation/compositor-animation-same-property.html b/ManualTests/animation/compositor-animation-same-property.html new file mode 100644 index 0000000..ebb0519 --- /dev/null +++ b/ManualTests/animation/compositor-animation-same-property.html 
@@ -0,0 +1,159 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: yellow; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Add second translate animation on timeout (with fill=forwards) +<br> +<div id="test1_blink">BLINK THREAD</div> +<div id="test1_impl">IMPL THREAD</div> +<hr> + +Add second translate animation on timeout if first one was paused earlier +<br> +<div id="test2_blink">BLINK THREAD</div> +<div id="test2_impl">IMPL THREAD</div> +<hr> + +Add second translate animation on timeout if first one was finished earlier +<br> +<div id="test3_blink">BLINK THREAD</div> +<div id="test3_impl">IMPL THREAD</div> +<hr> + +Add second translate animation on timeout if first higher-priority one was paused earlier +<br> +<div id="test4_blink">BLINK THREAD</div> +<div id="test4_impl">IMPL THREAD</div> +<hr> + +<script> +var leftKeyframes = [ + {left: '100px'}, + {left: '600px'} + ]; +var translateKeyframes = [ + {transform: 'translateX(100px)'}, + {transform: 'translateX(600px)'} + ]; + +var leftKeyframes2 = [ + {left: '600px'}, + {left: '700px'} + ]; +var translateKeyframes2 = [ + {transform: 'translateX(600px)'}, + {transform: 'translateX(700px)'} + ]; + +var player1_blink = test1_blink.animate(leftKeyframes, { + duration: 5000, + delay: 100, + fill: 'forwards' + }); +var player1_impl = test1_impl.animate(translateKeyframes, { + duration: 5000, + delay: 100, + fill: 'forwards' + }); + +var player2_blink = test2_blink.animate(leftKeyframes, { + duration: 5000, + delay: 100, + }); +var player2_impl = test2_impl.animate(translateKeyframes, { + duration: 5000, + delay: 100, + }); + +var player3_blink = test3_blink.animate(leftKeyframes, { + duration: 5000, + delay: 100, + }); +var player3_impl = test3_impl.animate(translateKeyframes, { + duration: 5000, + delay: 100, + }); + +// Create detached lower-priority second player with short animation +var player4_blink2 = test4_blink.animate(leftKeyframes2, { + duration: 1000, + delay: 500, + }); +player4_blink2.cancel(); +var player4_impl2 = test4_impl.animate(translateKeyframes2, { + duration: 1000, + delay: 500, + }); +player4_impl2.cancel(); + +var player4_blink = test4_blink.animate(leftKeyframes, { + duration: 5000, + delay: 100, + }); +var player4_impl = test4_impl.animate(translateKeyframes, { + duration: 5000, + delay: 100, + }); + +setTimeout(function() { + player2_blink.pause(); + player2_impl.pause(); + + player3_blink.finish(); + player3_impl.finish(); + + player4_blink.pause(); + player4_impl.pause(); +}, 1500); + +setTimeout(function() { + var player1_blink2 = test1_blink.animate(leftKeyframes2, { + duration: 1000, + delay: 500, + fill: 'forwards' + }); + var player1_impl2 = test1_impl.animate(translateKeyframes2, { + duration: 1000, + delay: 500, + fill: 'forwards' + }); + + var player2_blink2 = test2_blink.animate(leftKeyframes2, { + duration: 1000, + delay: 500, + }); + var player2_impl2 = test2_impl.animate(translateKeyframes2, { + duration: 1000, + delay: 500, + }); + + var player3_blink2 = test3_blink.animate(leftKeyframes2, { + duration: 1000, + delay: 500, + }); + var player3_impl2 = test3_impl.animate(translateKeyframes2, { + duration: 1000, + delay: 500, + }); + + player4_blink2.play(); + player4_impl2.play(); +}, 2500); +</script> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-steps.html b/ManualTests/animation/compositor-animation-steps.html new file mode 100644 index 0000000..3f6dca9 --- /dev/null +++ b/ManualTests/animation/compositor-animation-steps.html 
@@ -0,0 +1,119 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. +</p><p> +This test is successful if the boxes are mostly in sync and all finish at the +same time. +</p> +<hr> + +Steps for easing timing function is set to 9. +<br> +<div id="test1a">MT</div> +<div id="test1b">CT</div> +<hr> + +Per-keyframe steps easing function (18 and 9 steps). +<br> +<div id="test2a">MT</div> +<div id="test2b">CT</div> + +Cubic-bezier easing function combined with a step keyframe. +<br> +<div id="test3a">MT</div> +<div id="test3b">CT</div> + +Steps easing function combined with a cubic-bezier keyframe. +<br> +<div id="test4a">MT</div> +<div id="test4b">CT</div> + +<script> +var transformKeyframes = [ + {transform: 'translateX(0px)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframes = [ + {left: '0'}, + {left: '500px'} + ]; +var player1a = test1a.animate(leftKeyframes, { + duration: 6000, + iterations: Infinity, + easing: 'steps(9)' + }); +var player1b = test1b.animate(transformKeyframes, { + duration: 6000, + iterations: Infinity, + easing: 'steps(9)' + }); + +var transformKeyframesEasing = [ + {transform: 'translateX(0px)', easing: 'steps(18)'}, + {transform: 'translateX(250px)', easing: 'steps(9)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframesEasing = [ + {left: '0', easing: 'steps(18)'}, + {left: '250px', easing: 'steps(9)'}, + {left: '500px'} + ]; +var player2a = test2a.animate(leftKeyframesEasing, { + duration: 6000, + iterations: Infinity + }); +var player2b = test2b.animate(transformKeyframesEasing, { + duration: 6000, + iterations: Infinity + }); + +var transformKeyframesWithStepsKeyframe = [ + {transform: 'translateX(0px)', easing: 'steps(9)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframesWithStepsKeyframe = [ + {left: '0', easing: 'steps(9)'}, + {left: '500px'} + ]; +var player3a = test3a.animate(leftKeyframesWithStepsKeyframe, { + duration: 6000, + iterations: Infinity, + easing: 'cubic-bezier(.5, -1, .5, 2)' + }); +var player3b = test3b.animate(transformKeyframesWithStepsKeyframe, { + duration: 6000, + iterations: Infinity, + easing: 'cubic-bezier(.5, -1, .5, 2)' + }); + +var transformKeyframesWithCubicKeyframe = [ + {transform: 'translateX(0px)', easing: 'cubic-bezier(.5, -1, .5, 2)'}, + {transform: 'translateX(500px)'} + ]; +var leftKeyframesWithCubicKeyframe = [ + {left: '0', easing: 'cubic-bezier(.5, -1, .5, 2)'}, + {left: '500px'} + ]; +var player4a = test4a.animate(leftKeyframesWithCubicKeyframe, { + duration: 6000, + iterations: Infinity, + easing: 'steps(9)' + }); +var player4b = test4b.animate(transformKeyframesWithCubicKeyframe, { + duration: 6000, + iterations: Infinity, + easing: 'steps(9)' + }); +</script> +</body> +</html> 
diff --git a/ManualTests/animation/compositor-animation-style-change.html b/ManualTests/animation/compositor-animation-style-change.html new file mode 100644 index 0000000..ade2a7d --- /dev/null +++ b/ManualTests/animation/compositor-animation-style-change.html 
@@ -0,0 +1,98 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: green; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs as if no style change, the bottom +runs with on-the-fly style/source/target changes. +</p> +<hr> + +Layer attach/detach test (style.display block -> inline -> block) +<br> +<div id="test1_ref">REFERENCE</div> +<div id="test1_reattach">STYLE CHANGE</div> +<hr> + +Layer attach/detach test (style.display block -> none -> block), source, target. +<br> +<div id="test2_ref">REFERENCE</div> +<div id="test2_reattach">STYLE CHANGE</div> +<div id="test2_target">TARGET CHANGE</div> +<hr> + +<script> +var opacityKeyframes = [ + {opacity: 0}, + {opacity: 1} + ]; + +var player1_ref = test1_ref.animate(opacityKeyframes, { + duration: 5000, + delay: 100, + }); +var player1_reattach = test1_reattach.animate(opacityKeyframes, { + duration: 5000, + delay: 100, + }); + +test1_reattach.style.display = 'inline' +test1_reattach.style.display = 'block' + +var leftKeyframes = [ + {left: '100px'}, + {left: '600px'} + ]; +var translateKeyframes = [ + {transform: 'translateX(100px)'}, + {transform: 'translateX(600px)'} + ]; +var reverseTranslateKeyframes = [ + {transform: 'translateX(600px)'}, + {transform: 'translateX(100px)'} + ]; + +var player2_ref = test2_ref.animate(leftKeyframes, { + duration: 5000, + delay: 100, + }); +var player2_reattach = test2_reattach.animate(translateKeyframes, { + duration: 5000, + delay: 100, + }); + +test2_reattach.style.display = 'none' +test2_reattach.style.display = 'block' + +setTimeout(function() { + test1_reattach.style.display = 'inline' + test2_reattach.style.display = 'none' +}, 500); + +setTimeout(function() { + test1_reattach.style.display = 'block' + test2_reattach.style.display = 'block' +}, 2000); + +setTimeout(function() { + var animation = new KeyframeEffect(test2_reattach, + reverseTranslateKeyframes, 5000); + player2_reattach.source = animation; +}, 3000); + +setTimeout(function() { + var animation = new KeyframeEffect(test2_target, + reverseTranslateKeyframes, 5000); + player2_reattach.source = animation; +}, 4000); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-change-current-time.html b/ManualTests/animation/compositor-change-current-time.html new file mode 100644 index 0000000..d1633b3 --- /dev/null +++ b/ManualTests/animation/compositor-change-current-time.html 
@@ -0,0 +1,44 @@ +<style> +div { + height: 100px; + width: 100px; + background: blue; + margin: 10px; +} +</style> +<p> +Tests forcing changes to currentTime for a compositor animation. +<p> +The three squares should make identical movements from left to right, jumping every 200ms. +<div id="target1"></div> +<div id="target2"></div> +<div id="target3"></div> +<script> +var p1 = target1.animate([ + {transform: 'translate(0%)'}, + {transform: 'translate(800px)'} +], 1000); + +var p2 = target2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(800px)'} +], 1000); + +var p3 = target3.animate([ + {transform: 'translate(800px)'}, + {transform: 'translate(0px)'} +], 1000); +p3.reverse(); + +setInterval(function() { + p1.currentTime += 100; + p2.currentTime += 100; + p3.currentTime -= 100; + if (p1.playState == 'finished') + p1.play(); + if (p2.playState == 'finished') + p2.play(); + if (p3.playState == 'finished') + p3.play(); +}, 200); +</script> 
diff --git a/ManualTests/animation/compositor-change-playback-rate.html b/ManualTests/animation/compositor-change-playback-rate.html new file mode 100644 index 0000000..712c452 --- /dev/null +++ b/ManualTests/animation/compositor-change-playback-rate.html 
@@ -0,0 +1,42 @@ +<style> +div { + height: 100px; + width: 100px; + background: blue; +} +</style> +<p> +The four squares should make identical rotations at different rates without jumping. +<div id="target1"></div> +<div id="target2"></div> +<div id="target3"></div> +<div id="target4"></div> +<script> +var player1 = target1.animate([ + {transform: 'none'}, + {transform: 'rotate(90deg)'} +], {duration: 1000, iterations: 200000}); + +var player2 = target2.animate([ + {transform: 'none', background: 'blue'}, + {transform: 'rotate(90deg)', background: 'blue'} +], {duration: 1000, iterations: 200000}); + +var player3 = target3.animate([ + {transform: 'none'}, + {transform: 'rotate(90deg)'} +], {duration: 1000, iterations: Infinity}); + +var player4 = target4.animate([ + {transform: 'none', background: 'blue'}, + {transform: 'rotate(90deg)', background: 'blue'} +], {duration: 1000, iterations: Infinity}); + +setInterval(function() { + var playbackRate = (Math.random() - 0.5) * 5; + player1.playbackRate = playbackRate; + player2.playbackRate = playbackRate; + player3.playbackRate = playbackRate; + player4.playbackRate = playbackRate; +}, 100); +</script> 
diff --git a/ManualTests/animation/compositor-end-delay.html b/ManualTests/animation/compositor-end-delay.html new file mode 100644 index 0000000..24e91af --- /dev/null +++ b/ManualTests/animation/compositor-end-delay.html 
@@ -0,0 +1,32 @@ +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> + +Animation with endDelay on and off the compositor. The two boxes should have identical motions. +<br> + +<div id="target1"></div> +<div id="target2"></div> + +<script> +var player1 = target1.animate([ + {left: '0px'}, + {left: '400px'}, +], { + duration: 1000, + endDelay: -500, +}); + +var player2 = target2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(400px)'}, +], { + duration: 1000, + endDelay: -500, +}); +</script> 
diff --git a/ManualTests/animation/compositor-neutral-keyframes.html b/ManualTests/animation/compositor-neutral-keyframes.html new file mode 100644 index 0000000..ec44af1 --- /dev/null +++ b/ManualTests/animation/compositor-neutral-keyframes.html 
@@ -0,0 +1,52 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + will-change: transform; + left: 0px; + -webkit-animation-duration: 2s; + -webkit-animation-timing-function: linear; + -webkit-animation-iteration-count: 2; +} + +.anim-left { + -webkit-animation-name: anim-left; + z-index: 100; +} + +.anim-transform { + -webkit-animation-name: anim-transform; + z-index: 200; +} + +@-webkit-keyframes anim-left { + 100% { left: 300px; } +} + +@-webkit-keyframes anim-transform { + 100% { transform: translateX(300px); } +} +</style> +<body> +<p> +The section below has two boxes, the top runs on the main thread, the bottom +on the compositor. The animations should be identical but start at different +times. +</p><p> +This test is successful if the each pair of boxes are mostly in sync (there +might be a small offset between them). +</p> +<hr> + +<div id="target-left" class='anim-left'></div> +<div id="target-transform" class='anim-transform'></div> + +</body> +<script> + setTimeout(function() { document.getElementById('target-left').style.left = '500px'; }, 2000); + setTimeout(function() { document.getElementById('target-transform').style.transform = 'translateX(500px)'; }, 2000); +</script> +</html> 
diff --git a/ManualTests/animation/compositor-pause-play.html b/ManualTests/animation/compositor-pause-play.html new file mode 100644 index 0000000..b0535b4 --- /dev/null +++ b/ManualTests/animation/compositor-pause-play.html 
@@ -0,0 +1,43 @@ +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; +} +</style> + +Player modified then pause()/play() on and off the compositor. The two boxes should have identical motions. +<br> + +<div id="target1"></div> +<div id="target2"></div> + +<script> +var player1 = target1.animate([ + {left: '0px'}, + {left: '800px'}, +], { + duration: 1000, + direction: 'alternate', + iterations: Infinity, +}); + +var player2 = target2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(800px)'}, +], { + duration: 1000, + direction: 'alternate', + iterations: Infinity, +}); + +setInterval(function() { + player1.currentTime = 0; + player1.pause(); + player1.play(); + player2.currentTime = 0; + player2.pause(); + player2.play(); +}, 500); +</script> 
diff --git a/ManualTests/animation/compositor-reverse.html b/ManualTests/animation/compositor-reverse.html new file mode 100644 index 0000000..2ed9b57 --- /dev/null +++ b/ManualTests/animation/compositor-reverse.html 
@@ -0,0 +1,27 @@ +<style> +div { + height: 100px; + width: 100px; + background: blue; +} +</style> +<p> +The two squares should <strong>smoothly</strong> rock backwards and forwards. +<div id="target1"></div> +<div id="target2"></div> +<script> +var player1 = target1.animate([ + {transform: 'none'}, + {transform: 'rotate(90deg)'} +], 1000); + +var player2 = target2.animate([ + {transform: 'none', background: 'blue'}, + {transform: 'rotate(90deg)', background: 'blue'} +], 1000); + +setInterval(function() { + player1.reverse(); + player2.reverse(); +}, 100); +</script> 
diff --git a/ManualTests/animation/compositor-synchronized-start-reverse.html b/ManualTests/animation/compositor-synchronized-start-reverse.html new file mode 100644 index 0000000..dccb481 --- /dev/null +++ b/ManualTests/animation/compositor-synchronized-start-reverse.html 
@@ -0,0 +1,35 @@ +<style> +div { + height: 100px; + width: 100px; + background: blue; + margin: 10px; +} +</style> +<p> +Tests that a player playing in reverse started concurrently with another player receives the correct start time. +<p> +The three squares should make identical movements from left to right. +<div id="target1"></div> +<div id="target2"></div> +<div id="target3"></div> +<script> +var p1 = target1.animate([ + {transform: 'translate(800px)'}, + {transform: 'translate(-800px)'} +], 2000); +p1.currentTime = 1000; +p1.playbackRate = -1; + +var p2 = target2.animate([ + {transform: 'translate(800px)'}, + {transform: 'translate(0px)'} +], 1000); +p2.reverse(); + +var p3 = target3.animate([ + {transform: 'translate(-800px)'}, + {transform: 'translate(800px)'} +], 2000); +p3.currentTime = 1000; +</script> 
diff --git a/ManualTests/animation/compositor-transform-fill-forwards-with-motion-path.html b/ManualTests/animation/compositor-transform-fill-forwards-with-motion-path.html new file mode 100644 index 0000000..06a35b7 --- /dev/null +++ b/ManualTests/animation/compositor-transform-fill-forwards-with-motion-path.html 
@@ -0,0 +1,85 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + height: 90px; + width: 90px; + background: blue; +} + +#div1 { + z-index: 4; + left: 100px; + top: 200px; + motion-path: path('m 0 0 h 400'); +} + +#div2 { + z-index: 3; + left: 100px; + top: 300px; +} + +</style> +</head> +<body> +<p> +Tests that motion path animations stop an existing fill-forwards transform animation from being composited. +<p> +The two squares should equivalently move from left to right, pause and move back to left. They need not be perfectly in time. + +<div id="div1"></div> +<div id="div2"></div> + +<script> +var div1 = document.getElementById('div1'); +var div2 = document.getElementById('div2'); + +function startAnimations() { + div1.animate([ + {motionOffset: '0%'}, + {motionOffset: '100%'} + ], { + duration: 1000, + delay: 1000, + fill: 'forwards' + }); + div1.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(-400px)'} + ], { + duration: 1000, + delay: 3000, + fill: 'forwards' + }); + + div2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(400px)'} + ], { + duration: 1000, + delay: 1000, + fill: 'forwards' + }); + setTimeout(function() { + div2.style.motionPath = 'path("m 0 0 h -400")'; + div2.style.motionRotation = '0deg'; + div2.animate([ + {motionOffset: '0%'}, + {motionOffset: '100%'} + ], { + duration: 1000, + fill: 'forwards' + }); + }, 3000); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-transform-halted-by-motion-path.html b/ManualTests/animation/compositor-transform-halted-by-motion-path.html new file mode 100644 index 0000000..2ddf3e6 --- /dev/null +++ b/ManualTests/animation/compositor-transform-halted-by-motion-path.html 
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + height: 90px; + width: 90px; + background: blue; +} + +#div1 { + z-index: 1; + left: 100px; + top: 200px; +} + +#div2 { + z-index: 3; + left: 100px; + top: 300px; +} + +</style> +</head> +<body> +<p> +Tests that motion path animations stop an existing transform animation from being composited. +<p> +The two squares should make equivalent movements from left to right and back to left. They need not be perfectly in time. + +<div id="div1"></div> +<div id="div2"></div> + +<script> +var div1 = document.getElementById('div1'); +var div2 = document.getElementById('div2'); + +function startAnimations() { + div1.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(400px)'}, + {transform: 'translate(0px)'} + ], { + duration: 2000, + delay: 1000 + }); + + div2.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(800px)'} + ], { + duration: 2000, + delay: 1000 + }); + setTimeout(function() { + div2.style.motionPath = 'path("m 0 0 h -800")'; + div2.style.motionRotation = '0deg'; + div2.animate([ + {motionOffset: '0%'}, + {motionOffset: '100%'} + ], { + duration: 1000 + }); + }, 2000); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-transform-prevented-by-motion-path.html b/ManualTests/animation/compositor-transform-prevented-by-motion-path.html new file mode 100644 index 0000000..f89da85 --- /dev/null +++ b/ManualTests/animation/compositor-transform-prevented-by-motion-path.html 
@@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + height: 90px; + width: 90px; + background: blue; +} + +#div1 { + z-index: 4; + left: 100px; + top: 200px; + motion-path: path('m 0 0 h 800'); +} + +#div2 { + z-index: 5; + left: 100px; + top: 300px; + motion-path: path('m 0 0 h 400 z'); +} + +</style> +</head> +<body> +<p> +Tests that motion path animations prevent a future transform animation from being composited. +<p> +The two squares should make equivalent movements from left to right and back to left. They need not be perfectly in time. + +<div id="div1"></div> +<div id="div2"></div> + +<script> +var div1 = document.getElementById('div1'); +var div2 = document.getElementById('div2'); + +function startAnimations() { + div1.animate([ + {motionOffset: '0%'}, + {motionOffset: '100%'} + ], { + duration: 2000, + delay: 1000 + }); + div1.animate([ + {transform: 'translate(0px)'}, + {transform: 'translate(-800px)'} + ], { + duration: 1000, + delay: 2000 + }); + + div2.animate([ + {motionOffset: '0%'}, + {motionOffset: '100%'} + ], { + duration: 2000, + delay: 1000 + }); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-transform-with-rotate.html b/ManualTests/animation/compositor-transform-with-rotate.html new file mode 100644 index 0000000..6510e50 --- /dev/null +++ b/ManualTests/animation/compositor-transform-with-rotate.html 
@@ -0,0 +1,85 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + backface-visibility: visible; + height: 100px; + width: 100px; +} + +#div1 { + left: 100px; + top: 200px; + background-color: blue; +} + +#div2 { + left: 200px; + top: 200px; + background-color: red; +} +#div3 { + left: 300px; + top: 200px; + background-color: purple; +} + +</style> +</head> +<body> +<p> +Tests that composited animation happens when only transform or only rotate is present. +<p> +The 3 squares should equivalently rotate. They need not be perfectly in time. +<p> +Blue - Only Transform, Red - Only Rotate, Purple - Transform + Rotate  + +<div id="div1"></div> +<div id="div2"></div> +<div id="div3"></div> + +<script> +var div1 = document.getElementById('div1'); +var div2 = document.getElementById('div2'); +var div3 = document.getElementById('div3'); + +function startAnimations() { + div1.animate([ + {transform: 'rotate3d(1, 1, 0, 0deg)'}, + {transform: 'rotate3d(1, 1, 0, 720deg)'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); + + div2.animate([ + {rotate: '0deg 1 1 0'}, + {rotate: '720deg 1 1 0'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); + + div3.animate([ + {transform: 'rotate3d(1, 1, 0, 0deg)', + rotate: '0deg 1 1 0'}, + {transform: 'rotate3d(1, 1, 0, 360deg)', + rotate: '360deg 1 1 0'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-transform-with-scale.html b/ManualTests/animation/compositor-transform-with-scale.html new file mode 100644 index 0000000..5f44648 --- /dev/null +++ b/ManualTests/animation/compositor-transform-with-scale.html 
@@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + backface-visibility: visible; + height: 25px; + width: 25px; +} + +#div1 { + left: 100px; + top: 200px; + background-color: blue; +} + +#div2 { + left: 200px; + top: 200px; + background-color: red; +} +#div3 { + left: 300px; + top: 200px; + background-color: purple; +} + +</style> +</head> +<body> +<p> +Tests that composited animation happens when only transform or only scale is present. +<p> +The 3 squares should equivalently scale. They need not be perfectly in time. +<p> +Blue - Only Transform, Red - Only Scale, Purple - Transform + Scale  + +<div id="div1"></div> +<div id="div2"></div> +<div id="div3"></div> + +<script> +var div1 = document.getElementById('div1'); +var div2 = document.getElementById('div2'); +var div3 = document.getElementById('div3'); + +function startAnimations() { + div1.animate([ + {transform: 'scale(1, 1)'}, + {transform: 'scale(4, 4)'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); + + div2.animate([ + {scale: '1 1'}, + {scale: '4 4'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); + + div3.animate([ + {transform: 'scale(1, 1)', scale: '1 1'}, + {transform: 'scale(2, 2)', scale: '2 2'} + ], { + duration: 5000, + delay: 1000, + fill: 'forwards' + }); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/compositor-transform-with-translate.html b/ManualTests/animation/compositor-transform-with-translate.html new file mode 100644 index 0000000..c92c730 --- /dev/null +++ b/ManualTests/animation/compositor-transform-with-translate.html 
@@ -0,0 +1,84 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +div { + position: absolute; + height: 100px; + width: 100px; +} + +#div1 { + z-index: 4; + left: 100px; + top: 200px; + background-color: blue; +} + +#div2 { + z-index: 3; + left: 200px; + top: 200px; + background-color: red; +} + +#div3 { + z-index: 2; + left: 300px; + top: 200px; + background-color: purple; +} + +</style> +</head> +<body> +<p> +Tests that composited animation happens when only transform or only translate is present. +<p> +The 3 squares should equivalently move from top left to bot right. They need not be perfectly in time. +<p> +Blue - Only Transform, Red = Only Translate, Purple - Transform + Translate + +<div id="div1"></div> +<div id="div2"></div> +<div id="div3"></div> + +<script> +function startAnimations() { + div1.animate([ + {transform: 'translate(0px, 0px)'}, + {transform: 'translate(400px, 400px)'} + ], { + duration: 1000, + delay: 1000, + fill: 'forwards' + }); + + div2.animate([ + {translate: '0px 0px'}, + {translate: '400px 400px'} + ], { + duration: 1000, + delay: 1000, + fill: 'forwards' + }); + + div3.animate([ + {transform: 'translate(0px)', + translate: '0px 0px'}, + {transform: 'translate(400px)', + translate: '0px 400px'} + ], { + duration: 1000, + delay: 1000, + fill: 'forwards' + }); +} + +requestAnimationFrame(startAnimations); + +</script> + +</body> +</html> 
diff --git a/ManualTests/animation/set-to.svg b/ManualTests/animation/set-to.svg new file mode 100644 index 0000000..8b35459 --- /dev/null +++ b/ManualTests/animation/set-to.svg 
@@ -0,0 +1,10 @@ +<svg xmlns='http://www.w3.org/2000/svg'> + <rect width='100' height='100' fill='red' /> + <rect x='-100' width='100' height='100' fill='red'> + <set attributeName='x' to='0' dur='3s' /> + <set attributeName='fill' to='green' dur='3s' /> + </rect> + <text x='10' y='120'> + There should be a 100x100 green rect at 0,0. + </text>  +</svg> 
diff --git a/ManualTests/animation/transition-on-and-offscreen-animation.html b/ManualTests/animation/transition-on-and-offscreen-animation.html new file mode 100644 index 0000000..e41f0fe --- /dev/null +++ b/ManualTests/animation/transition-on-and-offscreen-animation.html 
@@ -0,0 +1,52 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Box Transitions coming out from the viewport.</title> + <style type="text/css" media="screen"> +  + .container { + height: 200px; + width: 200px; + border: 1px solid black; + background-color : red; + -webkit-transition: -webkit-transform 3s; + } +  + </style> + <script type="text/javascript" charset="utf-8"> + function runTest() + { + var box = document.getElementById("box"); + + window.setTimeout(function() { + box.style.webkitTransform = "translateX(" + window.innerWidth * 2.5 + "px)"; + }, 3000); +  + window.setTimeout(function() { + box.style.webkitTransform = "translateX(0px)"; + }, 6000); + + window.setTimeout(function() { + box.style.webkitTransform = "translateX(" + window.innerWidth * 2.5 + "px)"; + }, 9000); + + window.setTimeout(function() { + box.style.webkitTransform = "translateX(0px)"; + }, 12000); + } + window.addEventListener('load', runTest, false) + </script> +</head> +<body> +<p> +We should be able to see that the red box is going out and coming from the viewport twice. +The reason why the box goes to the viewport's 2.5x distance is that the backing store cannot create tile only if the GraphicsLayer is out of keepRect. +</p> +<div id="box" class="container"> +</div> + +</body> +</html> 
diff --git a/ManualTests/animation/transitions-and-paused-animations.html b/ManualTests/animation/transitions-and-paused-animations.html new file mode 100644 index 0000000..a1e2e53 --- /dev/null +++ b/ManualTests/animation/transitions-and-paused-animations.html 
@@ -0,0 +1,71 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Transitions and paused animations</title> + <style type="text/css" media="screen"> +  + .container { + height: 200px; + width: 200px; + border: 1px solid black; + -webkit-transition: -webkit-transform 0.5s; + } +  + .moved { + transform: translateX(100px); +  + } + .box { + position: relative; + height: 100px; + width: 100px; + margin: 50px; + background-color: blue; + transform: translateZ(0); + -webkit-animation: fade 1s infinite linear alternate; + } +  + .moved .box { + -webkit-animation-play-state: paused; + } +  + @-webkit-keyframes fade { + from { transform: rotate(-20deg); } + to { transform: rotate(20deg); } + } + </style> + <script type="text/javascript" charset="utf-8"> +  + function runTest() + { + var box = document.querySelectorAll('.box')[0]; + var container = document.querySelectorAll('.container')[0]; +  + window.setTimeout(function() { + container.className = 'container'; + }, 250); +  + window.setTimeout(function() { + container.className = 'container moved'; + }, 1500); + + window.setTimeout(function() { + container.className = 'container'; + }, 3000); + } +  + window.addEventListener('load', runTest, false) + </script> +</head> +<body> + +<p>Box should animate smoothly left, then right then left again, and not jump at the end.</p> +<div class="container moved"> + <div class="box"></div> +</div> + +</body> +</html> 
diff --git a/ManualTests/animation/transitions-composited-retargeting.html b/ManualTests/animation/transitions-composited-retargeting.html new file mode 100644 index 0000000..99ecf34 --- /dev/null +++ b/ManualTests/animation/transitions-composited-retargeting.html 
@@ -0,0 +1,75 @@ +<html> +<style> +div { + position: relative; + height: 100px; + width: 100px; + background: blue; + transition: left, transform 2s, 2s; + left: 0px; + transform: translateX(0); +} + +.transform-transition { + transform: translateX(500px); +} + +.left-transition { + left: 500px; +} + +.delay1 { + transition-delay: 0.5s; +} + +.delay2 { + transition-delay: 1s; +} +</style> +<body> +<p> +Each section below has two boxes, the top runs on the main thread, the bottom +on the compositor. The animations should be identical but start at different +times. +</p><p> +This test is successful if the each pair of boxes are mostly in sync (there +might be a small offset between them). +</p> +<hr> + +No delay +<br> +<div class="main-thread"></div> +<div class="compositor"></div> + +Delay - 0.5s +<br> +<div class="main-thread delay1"></div> +<div class="compositor delay1"></div> + +Delay - 1s +<br> +<div class="main-thread delay2"></div> +<div class="compositor delay2"></div> + +<script> +window.onload = function() +{ + function toggleTransition() { + var mainThread = document.querySelectorAll(".main-thread"); + for (var i = 0; i < mainThread.length; i++) + mainThread[i].classList.toggle("left-transition"); + var compositor = document.querySelectorAll(".compositor"); + for (var i = 0; i < compositor.length; i++) + compositor[i].classList.toggle("transform-transition"); + } + + toggleTransition(); + setTimeout(toggleTransition, 300); + setTimeout(toggleTransition, 1000); + setTimeout(toggleTransition, 2500); +} +</script> + +</body> +</html> 
diff --git a/ManualTests/applet-finish-parsing-children.html b/ManualTests/applet-finish-parsing-children.html new file mode 100644 index 0000000..842fd85 --- /dev/null +++ b/ManualTests/applet-finish-parsing-children.html 
@@ -0,0 +1,11 @@ +<p> + Test for <i><a href="rdar://problem/5816522">Bug 5816522</a> REGRESSION (r30111-30112): Tahoe web cam website has some text in Chinese or japanese</i>. +</p> +<p> + You should see the word PASS below. +</p> +<applet codebase="resources" code="DrawMessage.class" width=534 height=50> +<param name=text value="FAIL"> +<script src="data:text/javascript,document.body.offsetTop;"/> +<param name=text value="PASS"> +</applet> 
diff --git a/ManualTests/applet-param-no-name.html b/ManualTests/applet-param-no-name.html new file mode 100644 index 0000000..c6e8821 --- /dev/null +++ b/ManualTests/applet-param-no-name.html 
@@ -0,0 +1,4 @@ +<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=8437">http://bugs.webkit.org/show_bug.cgi?id=8437</a></p> +<p>This tests an applet element with a param element inside it with no name. If Java is enabled and Safari did not crash, then the test passed.</p> +<applet code=""><param></applet> +<script>document.body.offsetTop;</script> 
diff --git a/ManualTests/array-out-of-memory.html b/ManualTests/array-out-of-memory.html new file mode 100644 index 0000000..486e200 --- /dev/null +++ b/ManualTests/array-out-of-memory.html 
@@ -0,0 +1,42 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<script> + +function runArrayOOMTest() { + document.write("<p>Starting test...</p>"); + + // The index 'target' is the location in the array we expect to fault on access, should the size calculation of the realloc of the vector be allowed + // to overflow. The vector needs to be ((target + 1) * sizeof(JSValue*)) bytes long to hold 'target', or approximately 2/3 UINT32_MAX. Upon growing + // the array an additional 50% capacity will be allocated, plus the storage object header, taking the size of the allocation over UINT32_MAX. + var target = Math.floor(0xFFFFFFFF / 6); + // In order to force arr[target] to be stored in the vector, rather than the sparse map, we need ensure the vector is sufficiently densely populated. + var populate = Math.floor(target / 8 + 1); + + try { + var arr = new Array(); + for (i=0; i < populate; ++i) + arr[i] = 0; + arr[target] = 0; + } catch(e) { + var expect_name = "Error"; + var expect_message = "Out of memory"; + if ((e.name == expect_name) && (e.message == expect_message)) + document.write("<p>SUCCESS</p>"); + else + document.write("<p>FAIL - Expected \"" + expect_name + "/" + expect_message + "\", got \"" + e.name + "/" + e.message + "\".</p>"); + + return; + } + + document.write("<p>FAIL - Expected exception.</p>"); +} + +</script> +</head> +<body> +<p>This test checks that Array objects fail gracefully (throw exception) when array length grows large.</p> +<p>This test may run for over 20 seconds on a fast machine, and will consume hundereds of MB of memory.</p> +<input type="button" onclick="runArrayOOMTest()" value="Start"> +</body> +</html> 
diff --git a/ManualTests/arrow-key-events.html b/ManualTests/arrow-key-events.html new file mode 100644 index 0000000..81231f1 --- /dev/null +++ b/ManualTests/arrow-key-events.html 
@@ -0,0 +1,93 @@ +<body> +<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=3387">bug 3387</a>: +Redundant keydown, keypress, keyup events sent for arrow keys.</p> + +<p>Try pressing arrow keys, PgUp/PgDown/Home/End, Esc, or function keys.  +The test passes if the box below doesn't turn red.<p> + +<div id="result" style="width:100px; height:100px; background-color:blue;"></div> + +<script> + + var console_messages = document.createElement("ol"); + document.body.appendChild(console_messages); +  + window.onkeydown = registerWindow; + window.onkeypress = registerWindow; + window.onkeyup = registerWindow; + + document.onkeydown = registerDocument; + document.onkeypress = registerDocument; + document.onkeyup = registerDocument; + + document.body.onkeydown = registerBody; + document.body.onkeypress = registerBody; + document.body.onkeyup = registerBody; + + document.documentElement.onkeydown = registerDocumentElement; + document.documentElement.onkeypress = registerDocumentElement; + document.documentElement.onkeyup = registerDocumentElement; + + var bodyKeyDownCount = 0; + var documentElementKeyDownCount = 0; + var windowKeyDownCount = 0; + var documentKeyDownCount = 0; + + function log(message) + { + var item = document.createElement("li"); + item.appendChild(document.createTextNode(message)); + item.style.fontSize = '8px'; + console_messages.appendChild(item); + } + + function registerBody(e) + { + if ((e.type == "keydown" && ++bodyKeyDownCount != 1) + || (e.type == "keyup" && --bodyKeyDownCount != 0)) + document.getElementById("result").style.backgroundColor = "red"; + + if (!e) + e = window.event; + log("body: " + e.type); + return true; + } + + function registerDocumentElement(e) + { + if ((e.type == "keydown" && ++documentElementKeyDownCount != 1) + || (e.type == "keyup" && --documentElementKeyDownCount != 0)) + document.getElementById("result").style.backgroundColor = "red"; + + if (!e) + e = window.event; + log(" documentElement: " + e.type); + return true; + } + + function registerDocument(e) + { + if ((e.type == "keydown" && ++documentKeyDownCount != 1) + || (e.type == "keyup" && --documentKeyDownCount != 0)) + document.getElementById("result").style.backgroundColor = "red"; + + if (!e) + e = window.event; + log("  document: " + e.type); + return true; + } + + function registerWindow(e) + { + if ((e.type == "keydown" && ++windowKeyDownCount != 1) + || (e.type == "keyup" && --windowKeyDownCount != 0)) + document.getElementById("result").style.backgroundColor = "red"; + + if (!e) + e = window.event; + log("   window: " + e.type); + return true; + } + +</script> +</body> 
diff --git a/ManualTests/audio-freed-during-reload.html b/ManualTests/audio-freed-during-reload.html new file mode 100644 index 0000000..d661d91 --- /dev/null +++ b/ManualTests/audio-freed-during-reload.html 
@@ -0,0 +1,17 @@ +<html> + <script> + function go() { + var a = new Audio(); + a.autoplay = "1"; + a.src = "../LayoutTests/media/content/test.wav"; + } + </script> + + <body onload="go()"> + <p> + Load this page and open Activity Monitor, htop, chrome's task manager, or another resource monitor. + Reload the page a number of times and verify that the memory usage + doesn't keep climbing indefinitely per reload. + </p> + </body> +</html? 
diff --git a/ManualTests/audio-volume.html b/ManualTests/audio-volume.html new file mode 100644 index 0000000..f7e698c --- /dev/null +++ b/ManualTests/audio-volume.html 
@@ -0,0 +1,28 @@ +<html> + <script> + function load() + { + var url="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov"; + var vid = document.getElementById('vid') + vid.src = url; + vid.volume = 0.05; + vid.load(); + } + function setVolume(vol) + { + var vid = document.getElementById('vid') + vid.volume = vol; + } + </script> +  + <body> + + <video id=vid controls autoplay> + </video> + <p>TEST: Audio volume should be 0.05 when the movie begins playing.</p> + <input type="button" value="Load movie" onclick="load()"> + <br> + <input type="button" value="volume=1.0" onclick="setVolume(1.0)"> + <input type="button" value="volume=0.05" onclick="setVolume(0.05)"> + </body> +</html? 
diff --git a/ManualTests/autocompletion-fire-onchange.html b/ManualTests/autocompletion-fire-onchange.html new file mode 100644 index 0000000..c6ba288 --- /dev/null +++ b/ManualTests/autocompletion-fire-onchange.html 
@@ -0,0 +1,40 @@ +<html> +<head> +<script> +// This test case is based on the test case http://data.ici-bas.fr/chromiumissue10879/. +window.changed = false; +function checkForChange() +{ + if (!location.search) + return true; +  + if (!window.changed && document.getElementById("field").value != "") + log("FAIL"); + else + log("PASS"); + return false; +} + +function log(msg) +{ + document.getElementById("log").appendChild(document.createTextNode(msg + "\n")); +} +</script> +</head> +<body> +<p id="description">This test verifies that on autocompletion the 'onchange' event is fired.</p> +<p>Steps to reproduce:</p> +<ol> + <li>In the input field, type the word &quot;apple&quot; (without quotes). Then click the button Submit or hit the return/enter  + key on your keyboard</li> + <li>Once the page reloads, in the input field, type &quot;ap&quot; (without quotes) and let the browser autocomplete the word (or select  + &quot;apple&quot; from the autocompletion drop-down list contextual menu). Then click the button Submit or hit the return/enter  + key on your keyboard.</li> +</ol> +<form method="get" onsubmit="return checkForChange()"> + <p><input type="text" name="field" id="field" value="" onchange="window.changed = true"/></p> + <p><input type="submit" value="Submit"/></p> +</form> +<pre id="log"></pre> +</body> +</html> 
diff --git a/ManualTests/autocorrection/autocorrection-cancelled-by-ESC.html b/ManualTests/autocorrection/autocorrection-cancelled-by-ESC.html new file mode 100644 index 0000000..e6af6ec --- /dev/null +++ b/ManualTests/autocorrection/autocorrection-cancelled-by-ESC.html 
@@ -0,0 +1,50 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('c'); + typeCharacterCommand('o'); + typeCharacterCommand('l'); + typeCharacterCommand('l'); + typeCharacterCommand('a'); + typeCharacterCommand('p'); + typeCharacterCommand('s'); +} + +</script> + +<title>Autocorrection Cancellation By ESC Test</title> +</head> +<body> +<div><p>This test verifies that autocorrection is not applied when user dismisses correction panel by pressing +ESC key.</p> +<p>After seeing the correction panel, press ESC key, then press space. You should see the phrase "the collaps"  +where "collaps" has red mispell underline. </p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously  +dismissed 'collapse' as the correct spelling of 'collaps' several times, the spell checker will not provide  +'collapse' as a suggestion anymore. To fix this, remove all files in ~/Library/Spelling.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/autocorrection-cancelled-by-typing-1.html b/ManualTests/autocorrection/autocorrection-cancelled-by-typing-1.html new file mode 100644 index 0000000..3e78bb1 --- /dev/null +++ b/ManualTests/autocorrection/autocorrection-cancelled-by-typing-1.html 
@@ -0,0 +1,45 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('c'); + typeCharacterCommand('o'); + typeCharacterCommand('l'); + typeCharacterCommand('l'); + typeCharacterCommand('a'); + typeCharacterCommand('p'); + typeCharacterCommand('s'); +} + +</script> + +<title>Autocorrection Cancellation By Typing Test</title> +</head> +<body> +<div>This test verifies that autocorrection behaves correctly when continuing typing in a word on which autocorrection panel is hown. You should see correction panel showing 'collapse' after 'collaps' is entered. Then type "ing". Phrase 'the collapsing' should be shown without underline.</div> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously dismissed 'collapse' as the correct spelling of 'collaps' several times, the spell checker will not provide 'collapse' as a suggestion anymore. To fix this, remove all files in ~/Library/Spelling.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/autocorrection-contraction.html b/ManualTests/autocorrection/autocorrection-contraction.html new file mode 100644 index 0000000..ca40d62 --- /dev/null +++ b/ManualTests/autocorrection/autocorrection-contraction.html 
@@ -0,0 +1,45 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('i'); + typeCharacterCommand('s'); + typeCharacterCommand(' '); + typeCharacterCommand('w'); + typeCharacterCommand('o'); + typeCharacterCommand('u'); + typeCharacterCommand('l'); + typeCharacterCommand('d'); + typeCharacterCommand('n'); +} + +</script> + +<title>Autocorrection with Contraction Test</title> +</head> +<body> +<div><p>This test verifies that, after typing an apostrophe, if the current word is part of a contraction, previously shown autocorrection will not be applied.</p> +<p>After loading the page, you should see correction panel shows "would" for "wouldn". Then after typing "'t", the correction panel dissappears and the final sentence is "this wouldn't".</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/autocorrection-in-iframe.html b/ManualTests/autocorrection/autocorrection-in-iframe.html new file mode 100644 index 0000000..7e5de23 --- /dev/null +++ b/ManualTests/autocorrection/autocorrection-in-iframe.html 
@@ -0,0 +1,16 @@ +<html> +<head> + +<title>Test autocorreciton UI positioning in iframe</title> +</head> +<body> +<p>This test verifies that autocorrection UI is positioned correctly when the corrected word is in an iframe.</p> +<p>After typing "the manag", you should see the autocorrection UI is shown below the bounding box of the corrected word "manag".</p> +<br> +<br> +<br> +<div style="transform: translate(100px, 100px) rotate(20deg)"> + <iframe src="document-for-iframe-test.html"></iframe> +</div> +</body> +</html> 
diff --git a/ManualTests/autocorrection/close-window-when-correction-is-shown.html b/ManualTests/autocorrection/close-window-when-correction-is-shown.html new file mode 100644 index 0000000..5c82a20 --- /dev/null +++ b/ManualTests/autocorrection/close-window-when-correction-is-shown.html 
@@ -0,0 +1,48 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('e'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Testing closing window when correction suggestion is shown</title> +</head> +<body> +<div><p>This test verifies that when correction suggestion is visible, closing window doesn't hang or crash.</p> +<p>After seeing the panel with multiple candidates, close the window.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/continue-typing-to-dismiss-reversion.html b/ManualTests/autocorrection/continue-typing-to-dismiss-reversion.html new file mode 100644 index 0000000..a1011fa --- /dev/null +++ b/ManualTests/autocorrection/continue-typing-to-dismiss-reversion.html 
@@ -0,0 +1,49 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Continue Typing to Dismiss Reversion Panel Test</title> +</head> +<body> +<div><p>This test verifies that, after reversion panel is shown, continue typing will dismiss the reversion panel.</p> +<p>After seeing the reversion panel, start typing (excluding whitespace). You should see the panel being +dismissed once you start typing.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously  +frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/delete-to-dismiss-reversion.html b/ManualTests/autocorrection/delete-to-dismiss-reversion.html new file mode 100644 index 0000000..bbaa77d --- /dev/null +++ b/ManualTests/autocorrection/delete-to-dismiss-reversion.html 
@@ -0,0 +1,49 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Delete to Dismiss Reversion Panel Test</title> +</head> +<body> +<div><p>This test verifies that, after reversion panel is shown, continue deleting the word will dismiss the reversion panel.</p> +<p>After seeing the reversion panel, start deleting the corrected word character by character. You should see the panel being +dismissed once you start deleting.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously  +frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/delete-to-end-of-word-to-show-reversion.html b/ManualTests/autocorrection/delete-to-end-of-word-to-show-reversion.html new file mode 100644 index 0000000..aad1376 --- /dev/null +++ b/ManualTests/autocorrection/delete-to-end-of-word-to-show-reversion.html 
@@ -0,0 +1,47 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execDeleteCommand(); +} + +</script> + +<title>Delete to End of Word to Show Reversion Panel Test</title> +</head> +<body> +<div><p>This test verifies that reversion panel is shown when user moves carret to previously corrected word using delete key.</p> +<p>After seeing the reversion panel, press down key followed by return key. You should see the phrase "the mesage". </p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/dismiss-multiple-guesses.html b/ManualTests/autocorrection/dismiss-multiple-guesses.html new file mode 100644 index 0000000..67171b7 --- /dev/null +++ b/ManualTests/autocorrection/dismiss-multiple-guesses.html 
@@ -0,0 +1,49 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('e'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Dismiss Multiple Guesses Test</title> +</head> +<body> +<div><p>This test verifies that pressing ESC key diusmisses multiple guesses panel correctly</p> +<p>After seeing the panel with multiple candidates, pressing ESC key to dismiss the panel.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/document-for-iframe-test.html b/ManualTests/autocorrection/document-for-iframe-test.html new file mode 100644 index 0000000..629a830 --- /dev/null +++ b/ManualTests/autocorrection/document-for-iframe-test.html 
@@ -0,0 +1,36 @@ +<html> +<head> +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> + +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('a'); + typeCharacterCommand('n'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); +} +</script> + +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/move-to-end-of-word-to-show-reversion.html b/ManualTests/autocorrection/move-to-end-of-word-to-show-reversion.html new file mode 100644 index 0000000..ce0170a --- /dev/null +++ b/ManualTests/autocorrection/move-to-end-of-word-to-show-reversion.html 
@@ -0,0 +1,47 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Move to End of Word to Show Reversion Panel Test</title> +</head> +<body> +<div><p>This test verifies that reversion panel is shown when user moves carret to previously corrected word</p> +<p>After seeing the reversion panel, press down key followed by return key. You should see the phrase "the mesage". </p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/remove-misspelling-marker-after-appending-letter.html b/ManualTests/autocorrection/remove-misspelling-marker-after-appending-letter.html new file mode 100644 index 0000000..f1c5350 --- /dev/null +++ b/ManualTests/autocorrection/remove-misspelling-marker-after-appending-letter.html 
@@ -0,0 +1,45 @@ +<html>  +<head> + +<style> +.editing {  + border: 2px solid red;  + padding: 12px;  + font-size: 24px;  +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> + +function editingTest() { + textarea = document.getElementById('test'); + textarea.focus(); + document.execCommand("InsertText", false, "this brougt"); + typeCharacterCommand(' '); + document.execCommand("Delete"); + document.execCommand("Delete"); + typeCharacterCommand(' '); +  + // Now the word "brough" should carry misspelling marker. +  + document.execCommand("Delete"); +} + +</script> + +<title>Removing misspelling marker after appending letter test.</title>  +</head>  +<body> +<div>The test verified that misspelling marker is removed after appending new letter to misspelled word. You should see the phrase "this brought" without red underline.</div> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously dismissed 'brought' as the correct spelling of 'brougth' several times, the spell checker will not provide 'notational' as a suggestion anymore. To fix this, remove all files in ~/Library/Spelling.</p> +<textarea id="test" cols="80" rows="10"></textarea> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/select-from-multiple-guesses.html b/ManualTests/autocorrection/select-from-multiple-guesses.html new file mode 100644 index 0000000..cbd1dcd --- /dev/null +++ b/ManualTests/autocorrection/select-from-multiple-guesses.html 
@@ -0,0 +1,49 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('e'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Select From Multiple Guesses Test</title> +</head> +<body> +<div><p>This test verifies that multiple guesses on mispelled word is working correctly</p> +<p>After seeing the panel with multiple candidates, use left and/or right arrow key to select the desired candidate, and then use return key to confirm. You can also use this test to test that pressing ESC key will dismiss the panel.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/spell-checking-after-reversion.html b/ManualTests/autocorrection/spell-checking-after-reversion.html new file mode 100644 index 0000000..b125f8a --- /dev/null +++ b/ManualTests/autocorrection/spell-checking-after-reversion.html 
@@ -0,0 +1,53 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('c'); + typeCharacterCommand('y'); + typeCharacterCommand('l'); + typeCharacterCommand('i'); + typeCharacterCommand('n'); + typeCharacterCommand('d'); + typeCharacterCommand('r'); +} + +</script> + +<title>Spellchecking After Reversion Test</title> +</head> +<body> +<div><p>This test verifies the behavior of spellchecking after reversion.</p> +<ol> +<li>After seeing the correction panel, press space to accept the correction.</li> +<li>Press delete key to bring up reversion bubble.</li> +<li>Press down arrow followed by return key to accept the reversion suggestion.</li> +<li>Press space key again, and verify that the word "cylindr" IS NOT marked as misspelled.</li> +<li>Press delete key twice.</li> +<li>Press space key again, and verify that the word "cylind" IS marked as misspelled.</li> +</ol> +<p style="color:green">Note, this test can fail due to user specific spell checking data. To fix this, remove all files in ~/Library/Spelling.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/spellcheck-on-contraction-when-autocorrection-is-off.html b/ManualTests/autocorrection/spellcheck-on-contraction-when-autocorrection-is-off.html new file mode 100644 index 0000000..5e84078 --- /dev/null +++ b/ManualTests/autocorrection/spellcheck-on-contraction-when-autocorrection-is-off.html 
@@ -0,0 +1,24 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> + +<title>Undo Autocorrection Test</title> +</head> +<body> +<p>This test verifies that common contraction is not marked as misspelled when autocorrection is off.</p> +<p><b>Step 1:</b> Bring up contextual manual, and uncheck "Spelling and Grammar -> Correct Spelling Automatically" and "Substitutions -> Text Replacement".</p> +<p><b>Step 2:</b> Type "this wasn't", and verify that "wasn't" isn't marked as mispelled.</p> +<p><b>Step 3:</b> Restore the settings in contextual manual, otherwise it may affect the result of other autocorrection related tests.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/type-whitespace-to-dismiss-reversion.html b/ManualTests/autocorrection/type-whitespace-to-dismiss-reversion.html new file mode 100644 index 0000000..8eb346a --- /dev/null +++ b/ManualTests/autocorrection/type-whitespace-to-dismiss-reversion.html 
@@ -0,0 +1,48 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> +<script src=../../../../LayoutTests/editing/editing.js language="JavaScript" type="text/JavaScript" ></script> + +<script> +function editingTest() { + typeCharacterCommand('t'); + typeCharacterCommand('h'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + typeCharacterCommand('m'); + typeCharacterCommand('e'); + typeCharacterCommand('s'); + typeCharacterCommand('a'); + typeCharacterCommand('g'); + typeCharacterCommand('e'); + typeCharacterCommand(' '); + execMoveSelectionBackwardByCharacterCommand(); +} + +</script> + +<title>Type Whitespace to Dismiss Reversion Panel Test</title> +</head> +<body> +<div><p>This test verifies that, after reversion panel is shown, typing whitespace will dismiss the reversion panel.</p> +<p>After seeing the reversion panel, type whitespace. You should see the panel being dismissed once you start typing.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously  +frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + + +<script> +runEditingTest(); +</script> + +</body> +</html> 
diff --git a/ManualTests/autocorrection/undo-autocorrection.html b/ManualTests/autocorrection/undo-autocorrection.html new file mode 100644 index 0000000..972c88b --- /dev/null +++ b/ManualTests/autocorrection/undo-autocorrection.html 
@@ -0,0 +1,24 @@ +<html> +<head> + +<style> +.editing { + border: 2px solid red; + padding: 12px; + font-size: 24px; +} +</style> + +<title>Undo Autocorrection Test</title> +</head> +<body> +<div><p>This test verifies the behavior of undoing autocorrection.</p> +<p><b>Test 1:</b> Type "the mesage". After seeing the correction panel, type whitespace to accept the correction, then select undo. You should see the second word being reverted to "message".</p> +<p><b>Test 2:</b> Type "the ". Set font to bold, then type "me". Set font to regular, then type "sage". After seeing the correction panel, type whitespace to accept the correction, then select undo. You should see the second word being reverted to "message" with "me" in bold font.</p> +<p style="color:green">Note, this test can fail due to user specific spell checking data. If the user has previously frequently revert 'message' to 'mesage'. To fix this, remove all files in ~/Library/Spelling, then kill AppleSpell.service process.</p> +<div contenteditable id="root" class="editing"> +<span id="test"></span> +</div> + +</body> +</html> 
diff --git a/ManualTests/autofill-popup-location.html b/ManualTests/autofill-popup-location.html new file mode 100644 index 0000000..f662871 --- /dev/null +++ b/ManualTests/autofill-popup-location.html 
@@ -0,0 +1,32 @@ +<html> + <head> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> + <title> + Test autofill popup window shows at the correct location. + </title> + </head> + <body> + <h3>Test autofill popup window shows at the correct location.</h3> + <ol> + <li> Enter 'Always show bookmarks bar' in the following text input area.</li> + <li> Enter 'Test' in the text input area.</li> + <li> Press 'a' and make sure 'Always show bookmarks bar' is shown in autofill popup window.</li> + <li> Select all with pressing Ctrl-a.</li> + <li> Press 't' and make sure 'Test' is shown and the popup window location is correct.</li> + </ol> + <br> + <form><input name=q autofocus></form> + + <ol> + <li> Type the text 'This is really long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long text.' in the following text input area. And press ENTER to submit.</li> + <li>Return to this page</li> + <li> Press 'T' and make sure the input text is shown in autofill popup window and it exceeds the width of screen. If your display resolution is very high, and the while text fits in the window, please fill more characters and try again till the text exceeds the width. + <li> Type the text 'This is short text.' in the following text input area. And press ENTER to submit.</li> + <li> Press 't' and make sure the input text which you typed in is displayed in autofill popup window.</li> + <li> Press 'h' and make sure the popup window location is correct.</li> + <li> Press arrow key down and make sure the popup window text is not broken.</li> + </ol> + <br> + <form><input name=p></form> + </body> +</html>  
diff --git a/ManualTests/autofill-popup-width-and-item-direction.html b/ManualTests/autofill-popup-width-and-item-direction.html new file mode 100644 index 0000000..fa0a80a --- /dev/null +++ b/ManualTests/autofill-popup-width-and-item-direction.html 
@@ -0,0 +1,37 @@ +<html> +<head> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +<title> +Test the popup list box's width and its items' display directionality +</title> +</head> +<body> +<p> +Autofill popup list box should have the same width as its input field's width. +If the submitted input text is longer, it will be truncated to fit in the  +input field's width +<p> Try type some long text in the "Last name" input box, + Say "abcd abcd abcd abcd abcd abcd". +then click "Submit". Open the file again, and type the first letter "a", +the form autofill pop-up should show up now with the width the same as +the width of the input field, and the text "abcd abcd abcd abcd abcd abcd" got +truncated to fit in. +<p> Try type the following text into the "First name" and "Last name". +<ul> +<li>abcd efg +<li>שששששש ננננננ בבבבבבבבב +<li>abc אאא defghijklmnopq +<li>אאאאאאאאאא abcdefghijklmn בבבבבבב +<li>hi! +<li>אא! +</ul> +They should be displayed as RTL in the popup of "First name",  +and should be displayed as LTR in the popup of the "Last name". +<br> +<form action="form_action.asp" method="get"> + First name: <input type="text" name="fname" dir="rtl"/><br /> + Last name: <input type="text" name="lname" /><br /> + <input type="submit" value="Submit" /> +</form> +</body> +</html> 
diff --git a/ManualTests/autofill_alignment.html b/ManualTests/autofill_alignment.html new file mode 100644 index 0000000..4863e41 --- /dev/null +++ b/ManualTests/autofill_alignment.html 
@@ -0,0 +1,25 @@ +<html> +<head> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +<title> +Test auto-fill drop-down items' alignment +</title> +</head> +<body> +<p> +Autofill drop-down item's alignment should be the same as the input field. +It should align left if the input field's direction is ltr. It should  +align right if the input field's direction is rtl. +<p> Try type some text in the "First name" and "Last name" input box, +then click "Submit". Open the file again, double click the "First name" +field, the drop-down box should be opened with the items aligned right. +Double click the "Last name" field, the drop-down box should be opened +with the items aligned left. +<br> +<form action="form_action.asp" method="get"> + First name: <input type="text" name="fname" dir="rtl"/><br /> + Last name: <input type="text" name="lname" /><br /> + <input type="submit" value="Submit" /> +</form> +</body> +</html> 
diff --git a/ManualTests/autoscroll-over-scrollbar.html b/ManualTests/autoscroll-over-scrollbar.html new file mode 100644 index 0000000..2330ed1 --- /dev/null +++ b/ManualTests/autoscroll-over-scrollbar.html 
@@ -0,0 +1,8 @@ +<html> + <body>  + <h1><a href="https://bugs.webkit.org/show_bug.cgi?id=40403">Bug 40403</a></h1> + <p>Click down somewhere in this text, then move the pointer over the scrollbar at the bottom of the window, stop there, holding the mouse button down.</p> + <div style="height:3000px; width:3000px;"></div> + <p>If the bug occurs, then this text won't be selected until you move the mouse slightly. If the bug does not occur, this text should be selected.</p> + </body> +</html> 
diff --git a/ManualTests/autoscroll-when-outside-window.html b/ManualTests/autoscroll-when-outside-window.html new file mode 100644 index 0000000..91b4ecf --- /dev/null +++ b/ManualTests/autoscroll-when-outside-window.html 
@@ -0,0 +1,7 @@ +<html> + <body> + <p>Click somewhere in this text, then quickly drag past the bottom of the window and hold still to allow auto-scrolling to happen.</p> + <div style="height:3000px"></div> + <p>If the bug occurs, then this text won't be selected until you move the mouse slightly. If the bug does not occur, this text should be selected.</p> + </body> +</html> 
diff --git a/ManualTests/autoscroll.html b/ManualTests/autoscroll.html new file mode 100644 index 0000000..db9bd90 --- /dev/null +++ b/ManualTests/autoscroll.html 
@@ -0,0 +1,32 @@ +<head> +<script> +function addFrameText() { + frameDoc = window.frames[0].document; + item = frameDoc.createElement("p"); + item.appendChild(frameDoc.createTextNode("Hello, world!")); + for (i = 0; i < 1000; ++i) { + frameDoc.body.appendChild(item.cloneNode(true)); + } +} +</script> +</head> + +<body onload="javascript:addFrameText()"> + +<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=11718">bug 11718</a>: +When I mouse up after dragging a selection outside of a iframe, the iframe continues to scroll automatically.</p> + +<p>Make the frame autoscroll by moving the mouse pointer outside of it while selecting.  +Autoscrolling should stop when you release the mouse button outside the frame (in the main frame,  +in another subframe, or just outside the window).</p> + +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=49209">bug 49209</a>: +Open another page in a different tab, middle click in the first iframe, scroll up, and select the other tab. The pan scrolling +cursor should disappear, and you should exit pan scrolling mode.</p> + +<IFRAME FRAMEBORDER=1></IFRAME> +<br> +<IFRAME FRAMEBORDER=1></IFRAME> + +</body> +</html> 
diff --git a/ManualTests/back-forward-during-alert-1.html b/ManualTests/back-forward-during-alert-1.html new file mode 100644 index 0000000..41a6e6a --- /dev/null +++ b/ManualTests/back-forward-during-alert-1.html 
@@ -0,0 +1,3 @@ +<body> +View this page, then click <a href="back-forward-during-alert-2.html">here.</a> +</body> 
diff --git a/ManualTests/back-forward-during-alert-2.html b/ManualTests/back-forward-during-alert-2.html new file mode 100644 index 0000000..931af01 --- /dev/null +++ b/ManualTests/back-forward-during-alert-2.html 
@@ -0,0 +1,10 @@ +<script> +function loaded() +{ + alert("While this alert is showing, two-fingered swipe back using a MacBook trackpad, Magic Trackpad, or Magic Mouse. You should not be able to navigate back. If you can, dismissing this dialog will likely result in a crash."); +} +</script> + +<body onload="loaded();"> +Follow the instructions in the alert that shows up on page load. +</body> 
diff --git a/ManualTests/back-from-document-with-scrollbar.html b/ManualTests/back-from-document-with-scrollbar.html new file mode 100644 index 0000000..800437f --- /dev/null +++ b/ManualTests/back-from-document-with-scrollbar.html 
@@ -0,0 +1,42 @@ +<html> +<head> +<script> + +function navigate() +{ + if (location.hash == "") { + if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); + } + + history.pushState({ }, "", window.location + "#1"); + setTimeout(function() { + window.location.href = 'data:text/html, \ + <html style="height: 200%"> \ + <body onunload=""> \ + <script> \ + document.body.offsetWidth; \ + setTimeout("window.history.back();", 0); \ + <' + '/script> \ + </body> \ + </html> \ + '; + }, 0); + return; + } + + setTimeout(function () {  + var result = document.getElementById("result"); + result.innerHTML = "Success if the web process did not crash." + if (window.layoutTestController) + layoutTestController.notifyDone(); + }, 0); +} + +</script> +</head> +<body onpageshow="navigate();"> + <div id="result">Test did not complete</div> +</body> +</htmL> 
diff --git a/ManualTests/back.html b/ManualTests/back.html new file mode 100644 index 0000000..4eea5df --- /dev/null +++ b/ManualTests/back.html 
@@ -0,0 +1 @@ +<input type="button" onclick="history.back()" value="Go Back"> \ No newline at end of file 
diff --git a/ManualTests/background-image-change-in-page-cache.html b/ManualTests/background-image-change-in-page-cache.html new file mode 100644 index 0000000..c6fb38e --- /dev/null +++ b/ManualTests/background-image-change-in-page-cache.html 
@@ -0,0 +1,30 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=12773">12773</a> REGRESSION (r19490): Crash on ipx-server.de</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click the link below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +A SUCCESS message will appear at the bottom of the page and Safari will not crash. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Safari will crash or the SUCCESS message will not appear. +</p> + +<div style="background-image: url(resources/3dolph.gif); height: 2px; width: 2px;"> +</div> +<a href="?clicked">Click here</a> +<div id="result"></div> +<script> + if (location.href.match("clicked$")) + document.getElementById("result").innerText = "SUCCESS"; +</script> +</body> +</html> 
diff --git a/ManualTests/bad-clearTimeout-crash.html b/ManualTests/bad-clearTimeout-crash.html new file mode 100644 index 0000000..b7ee23c --- /dev/null +++ b/ManualTests/bad-clearTimeout-crash.html 
@@ -0,0 +1,13 @@ +If the back/forward cache is enabled, this test will crash instead of going to the next page that says PASS. + +It cannot be automated because DumpRenderTree doesn't support the back/forward cache. + +<script> +if (window.layoutTestController) + layoutTestController.waitUntilDone(); + +setTimeout('',1000); +clearTimeout(0); +clearTimeout(0); +window.location = "data:text/html,This test shouldn't crash. PASS.<scr" + "ipt>if (window.layoutTestController) layoutTestController.notifyDone()</scr" + "ipt>"; +</script> 
diff --git a/ManualTests/bidi-parens.html b/ManualTests/bidi-parens.html new file mode 100644 index 0000000..cbbd854 --- /dev/null +++ b/ManualTests/bidi-parens.html 
@@ -0,0 +1,18 @@ +<html> +<head> +<style> +.console { + font-family: Arial, Times New Roman +} +</style> +</head> +<body> +<p>This test checks for a regression against <a href="http://bugs.webkit.org/show_bug.cgi?id=3435">3435 Parentheses are backwards in Hebrew text (no bidi mirroring?)</a>.</p> +<p>Success: parentheses encapsulate word.</p> +<p>Failure: parentheses face away from word.</p> +<hr> +<p id="console" dir="rtl"> +(למדינות) +</p> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/bidi-visible-control-characters.html b/ManualTests/bidi-visible-control-characters.html new file mode 100644 index 0000000..7eeac06 --- /dev/null +++ b/ManualTests/bidi-visible-control-characters.html 
@@ -0,0 +1,12 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  +"http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-8"> +<title>Internal bidi control characters are visible</title> +</head> +<body> +<p>Since the current default font does not contain bidi control characters, this test needs to be manual. The following paragraph should contain only 3 hebrew characters (and no control characters).</p> +<p style="font-family:Arial;">&#x05d2;&#x05d1;&#x05d0;</p> +</body> +</html> 
diff --git a/ManualTests/bugzilla-14899.html b/ManualTests/bugzilla-14899.html new file mode 100644 index 0000000..1cee31a --- /dev/null +++ b/ManualTests/bugzilla-14899.html 
@@ -0,0 +1,33 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> + <script> + function test() + { + document.getElementById("z").style.display='block'; + open("data:text/html,SUCCESS"); + } + </script> +</head> +<body> + <p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=14899">Bugzilla bug 14899</a> !d->m_view->needsLayout() in Frame::paint() (Causes assert)</p> +  + <p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  + Make sure you are using a debug build of the Web Kit framework. Click the Test button below. + </p> +  + <p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  + A new window will open. + </p> +  + <p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  + An assertion failure will occur. + </p> + <button onclick="test()">Test</button> + <div id="z" style="display: none;"> + <object> + <embed width="40" src="resources/orange.mov" controller="false"> + </object> + </div> +</body> 
diff --git a/ManualTests/bugzilla-3855.html b/ManualTests/bugzilla-3855.html new file mode 100644 index 0000000..dd19104 --- /dev/null +++ b/ManualTests/bugzilla-3855.html 
@@ -0,0 +1,34 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=3855">Bugzilla Bug 3855</a> Table with Form Field and Hidden DIV crashes Safari</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Type in the text field below.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Safari will not crash, text will show up in text field as expected. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Safari will crash. +</p> + +Type in the input field below: +<form> +<div style="display:none;"> +<table> + <tr> + <td>test</td> + </tr> + </table> +</div> + +<input type='text' value='' /> +</form> + +</body> +</html> 
diff --git a/ManualTests/bugzilla-48077.html b/ManualTests/bugzilla-48077.html new file mode 100644 index 0000000..67bb1f1 --- /dev/null +++ b/ManualTests/bugzilla-48077.html 
@@ -0,0 +1,87 @@ +<html> +<!-- +This test case is used to prove HTMLParserScheduler should be suspended when page loading is deferred. See https://bugs.webkit.org/show_bug.cgi?id=48077. +However, this test case can work only when customHTMLTokenizerChunkSize() is equal to or smaller than 256. To reproduce the problem with other settings, try +adding more tags into body. + +To use the test case, open it in browser, when the alert shows up, wait for a few seconds, and close the alert. If it shows "Error detected", that means the problem exists. +--> +<script> +var showingAlert = false; + +function log(message, replace) +{ + if (replace) + document.getElementById("result").innerHTML = message; + else + document.getElementById("result").innerHTML += "<br>" + message; +} + +function showAlert() +{ + showingAlert = true; + alert("Test"); + showingAlert = false; +} + +// Insert a script element so the script will be executed when the resource is loaded. +function insertScript() +{ + var head = document.getElementsByTagName("head")[0]; + var myScript = document.createElement('script'); + myScript.type = 'text/javascript'; + myScript.src = 'resources/bugzilla-48077.js'; + head.appendChild(myScript); +} +function check() +{ + // Check JS re-entrancy. If showingAlert is true, we are still in showAlert(). + if (showingAlert) + log("Error detected!", false); + else + log("No error detected.", false); +} + +// Do a time consuming job so we can make HTML parser run over time limit. +function logTime() +{ + // time consuming job; + var startTime = new Date(); + do { + var currentTime = new Date(); + log(currentTime, true); + } while (currentTime - startTime < 1000); +} +</script> +<body> +<p id="result"></p> + +<script> +insertScript(); +</script> + +<!-- Time consuming job to make HTML parser run over chunk time limit --> +<script> +logTime(); +</script> + +<!-- Lots of tags to make HTML parser run over chunk size limit --> +<a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a> + +<!-- Time consuming job to make HTML parser run over chunk time limit --> +<script> +logTime(); +</script> + +<!-- Lots of tags to make HTML parser run over chunk size limit --> +<a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a> + + +<script> +check(); +</script> + + + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/bugzilla-4840.html b/ManualTests/bugzilla-4840.html new file mode 100644 index 0000000..6cf68bd --- /dev/null +++ b/ManualTests/bugzilla-4840.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=4840">Bugzilla bug 4840</a> Frames only resize wider, can't make them narrower</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Drag the vertical split bar below to the left and release it. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The frames will resize accordingly, with the split bar where you released it. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The split bar will not follow the mouse when dragged to the left. After releasing +the mouse button, the frames will not resize and the split bar will continue to +follow the mouse. +</p> + +<iframe style="width: 100%; height: 200px;" src="data:text/html,<frameset cols=%22*, *%22><frameset rows=%22*, *%22><frame src=%22about:blank%22><frame src=%22about:blank%22></frameset><frame src=%22about:blank%22></frameset>"></iframe> + +</body> +</html> 
diff --git a/ManualTests/bugzilla-5768.html b/ManualTests/bugzilla-5768.html new file mode 100644 index 0000000..4ead9f2 --- /dev/null +++ b/ManualTests/bugzilla-5768.html 
@@ -0,0 +1,41 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"  +"http://www.w3.org/TR/html4/frameset.dtd"> +<html> +<head> +<title>No relayout when all frames are fixed</title> +<script type="text/javascript"> +if (window.layoutTestController) + layoutTestController.waitUntilDone(); +var i = 0; +function test() +{ + i++; + var f = document.getElementById('f'); + switch(i) { + case 1: + window.setTimeout(test, 100); + break; + case 2: + f.src = "resources/frame2.html"; + break; + case 3: + window.setTimeout(test, 100); + break; + case 4: + f.src = "resources/frame1.html"; + break; + case 5: + window.setTimeout(test, 100); + break; + case 6: + if (window.layoutTestController) + layoutTestController.notifyDone(); + break; + } +} +</script> +</head> +<frameset> + <frame onload="test()" id="f" src="resources/frame1.html" noresize> +</frameset> +</html> 
diff --git a/ManualTests/bugzilla-83979.svg b/ManualTests/bugzilla-83979.svg new file mode 100644 index 0000000..8712581 --- /dev/null +++ b/ManualTests/bugzilla-83979.svg 
@@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <filter id="ds2"> + <feGaussianBlur id="blur" result="blur"/> + </filter> + </defs> + <text x="50" y="50">This test passes if it does not crash after load in Debug builds.</text> + <image id="image" xlink:href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Crect/%3E%3C/svg%3E" width="50" height="50" filter="url(#ds2)"/> +<script><![CDATA[ +for (var i = 0; i < 10000; i++) { +} +document.getElementById("blur").appendChild(document.getElementById("image").cloneNode()); +for (var i = 0; i < 10000; i++) { +} +]]></script> +</svg> 
diff --git a/ManualTests/canvas-animation-update.html b/ManualTests/canvas-animation-update.html new file mode 100644 index 0000000..1832490 --- /dev/null +++ b/ManualTests/canvas-animation-update.html 
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> +<body> +This test verifies that canvas animations update properly with anuimation loops that use setTimeout. Eight vertical green bars should appear below this text. +<canvas id="c" width="400" height="200"></canvas> +<script type="text/javascript"> +var canvas = document.getElementById('c'); +var ctx = canvas.getContext('2d'); +ctx.fillStyle = 'green'; +var xpos = 0; + +if (window.testRunner) { + testRunner.waitUntilDone(); +} + +function draw() { + ctx.fillRect(xpos, 0, 40, 200); + xpos = xpos + 50; + if (xpos < 400) { + window.setTimeout(draw, 16); + } else { + if (window.testRunner) { + testRunner.notifyDone(); + } + } +} + +draw(); +</script> +</body> +</html> 
diff --git a/ManualTests/canvas-cursor.html b/ManualTests/canvas-cursor.html new file mode 100644 index 0000000..e1f73e7 --- /dev/null +++ b/ManualTests/canvas-cursor.html 
@@ -0,0 +1,41 @@ +<html> +<body> +This is a test of our ability to convert a canvas to a data url and use it as a cursor. We pass if the cursor animates smoothly and without flickering.<br> +See https://bugs.webkit.org/show_bug.cgi?id=64321. +<canvas id="c" width="40" height="40"></canvas> +<script type="text/javascript"> +var icon = new Image; +icon.src = 'resources/drag-image.png' + +function drawArrow(angle) { + var canvas = document.getElementById('c'); + canvas.width = canvas.width // reset canvas + var ctx = canvas.getContext('2d'); + + ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2); + ctx.rotate(angle); + ctx.drawImage(icon, -icon.width / 2, -icon.height / 2); + + var x = 20;//Math.floor(Math.cos(angle) * icon.width / 2) + icon.width / 2; + var y = 20;//Math.floor(Math.sin(angle) * icon.width / 2) + icon.width / 2; + + var data = canvas.toDataURL(); + if (data) + document.body.style.cursor = 'url('+data+') ' + x + ' ' + y + ', pointer'; + else + console.log('failure'); +} + +(function() { + var angle = 0; + var run = function() { + angle += Math.PI / 16; + drawArrow(angle); + setTimeout(run, 100); + }; + run(); +})(); + drawArrow(); +</script> +</body> +</html> 
diff --git a/ManualTests/canvas-font-speed-switching.html b/ManualTests/canvas-font-speed-switching.html new file mode 100644 index 0000000..8a21cf3 --- /dev/null +++ b/ManualTests/canvas-font-speed-switching.html 
@@ -0,0 +1,21 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<title>Canvas 2d Context Font Property Speed</title> +</head> +<body> + <canvas id='thecanvas' height=100 width=100/> + <script> + var canvas = document.getElementById('thecanvas'); + var context = canvas.getContext('2d'); + var t0 = Date.now(); + for (var i = 0; i < 1000; i++) { + if(i % 2 == 0) + context.font = 'bold 13px Arial'; + else + context.font = 'italic 13px Arial'; + } + alert('Elapsed for 1000 font switches: ' + (Date.now() - t0)); + </script> +</body> +</html> 
diff --git a/ManualTests/canvas-font-speed.html b/ManualTests/canvas-font-speed.html new file mode 100644 index 0000000..fba6bce --- /dev/null +++ b/ManualTests/canvas-font-speed.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> +<html> +<head> +<title>Canvas 2d Context Font Property Speed</title> +</head> +<body> + <canvas id='thecanvas' height=100 width=100/> + <script> + var canvas = document.getElementById('thecanvas'); + var context = canvas.getContext('2d'); + var t0 = Date.now(); + for (var i = 0; i < 1000; i++) { + context.font = 'bold 13px Arial'; + } + alert('Elapsed for 1000 font settings: ' + (Date.now() - t0)); + </script> +</body> +</html> 
diff --git a/ManualTests/canvas-large-temporary.html b/ManualTests/canvas-large-temporary.html new file mode 100644 index 0000000..d8cb82b --- /dev/null +++ b/ManualTests/canvas-large-temporary.html 
@@ -0,0 +1,30 @@ +<html> +<head> +<script src="../LayoutTests/fast/js/resources/js-test-pre.js"></script> +</head> +<body> +<script> +description("Test to verify that serial allocation and dereferencing of large canvases will succeed"); +// This is a manual test because it runs too slow as a LayoutTest, especially for GPU tests with mesa. + +// 32 canvases of 8k x 8k will consume 8GB of RAM. +// Garbage collection should kick-in to prevent OOM failures. +for (var i = 0; i < 32; i++) { + var canvas = document.createElement('canvas'); + canvas.width = 8192; + canvas.height = 8192; + // Draw to trigger lazy backing store allocation + var ctx = canvas.getContext('2d'); + ctx.fillStyle = '#0f0'; + ctx.fillRect(0, 0, 1, 1); + // Verify that allocation succeeded by verifying that draw succeeded + var imageData = ctx.getImageData(0, 0, 1, 1); + var imgdata = imageData.data; + shouldBe("imgdata[0]", "0"); + shouldBe("imgdata[1]", "255"); + shouldBe("imgdata[2]", "0"); +} +</script> +<script src="../LayoutTests/fast/js/resources/js-test-post.js"></script> +</body> +</html> 
diff --git a/ManualTests/canvas-mask-redraw.html b/ManualTests/canvas-mask-redraw.html new file mode 100644 index 0000000..315ede2 --- /dev/null +++ b/ManualTests/canvas-mask-redraw.html 
@@ -0,0 +1,65 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Canvas Mask</title> + <style type="text/css" media="screen"> + #canvas1 { + height: 300px; + width: 400px; + border: 1px solid black; + } + + .masked { +/* transform: rotate(10deg);*/ + -webkit-mask: -webkit-canvas(canvas1); + } + </style> + <script type="text/javascript" charset="utf-8"> +  + var gPageWidth = 320; + var gPageHeight = 200; + + function drawPageShadow(shadowWidth) + { + var ctx = document.getCSSCanvasContext('2d', 'canvas1', gPageWidth, gPageHeight); + ctx.clearRect (0, 0, gPageWidth, gPageHeight); + + var gradient = ctx.createLinearGradient(0, 0, shadowWidth, 0); + gradient.addColorStop(0, 'rgba(0,0,0,1)'); + gradient.addColorStop(1, 'rgba(0,0,0,0)'); + ctx.fillStyle = gradient; + ctx.fillRect (0, 0, shadowWidth, gPageHeight);  + } +  + function redrawCanvas(event) + { + drawPageShadow(event.pageX); + } +  + function onPageLoad() + { + drawPageShadow(640); + } +  + window.addEventListener('load', onPageLoad, false); +  + </script> +</head> +<body> + + <p>Hovering over the image or text should cause the element to be redrawn with a new mask</p> + <a href="https://bugs.webkit.org/show_bug.cgi?id=19954">https://bugs.webkit.org/show_bug.cgi?id=19954</a> + <h2>Image with mask</h2> + <img src="http://www.google.com/intl/en_ALL/images/logo.gif" width="320" height="200" alt="Clown Fish" class="masked" + onmousemove="redrawCanvas(event)"> + + <h2>Div with mask</h2> + <div class="masked" style="width: 640px" onmousemove="redrawCanvas(event)"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </div> +  +</body> +</html> 
diff --git a/ManualTests/canvas-putImageData-flicker.html b/ManualTests/canvas-putImageData-flicker.html new file mode 100644 index 0000000..dfe988f --- /dev/null +++ b/ManualTests/canvas-putImageData-flicker.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<body> +This is a test should draw a fine filtered checkerboard pattern with no flickering. <br> +This is a regression test for https://bugs.webkit.org/show_bug.cgi?id=64321. <br> +<canvas id="c" width="300" height="300" style="width : 600px; height : 600px"></canvas> +<script type="text/javascript"> +var canvas = document.getElementById('c'); +var ctx = canvas.getContext('2d'); + +for (var x = 0; x < canvas.width; x++) { + for (var y = 0; y < canvas.height; y++) { + ctx.fillStyle = ((x + y) % 2) ? 'black' : 'white'; + ctx.fillRect(x, y, 1, 1); + } +} + +var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + +function draw() { + ctx.putImageData(imageData, 0, 0); + window.setTimeout(draw, 0); +} + +draw(); +</script> +</body> +</html> 
diff --git a/ManualTests/caret-blink-during-forward-delete.html b/ManualTests/caret-blink-during-forward-delete.html new file mode 100644 index 0000000..eea0ac1 --- /dev/null +++ b/ManualTests/caret-blink-during-forward-delete.html 
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<body> +<p>This tests forward deleting 200 characters with 10ms intervals. +The caret shown below should not blink while the characters are being deleted.</p> +<div id="test" contenteditable></div> +<script> + +var test = document.getElementById('test'); +var text = ''; +for (var i = 0; i < 200; i++) + text += 'a'; +test.textContent = text; + +test.focus(); +getSelection().collapse(test, 0); +for (var i = 0; i < 200; i++) + setTimeout(function () {document.execCommand('ForwardDelete', false, null);}, i * 10); + +</script> +</body> +</html> 
diff --git a/ManualTests/caret-image.html b/ManualTests/caret-image.html new file mode 100644 index 0000000..a6dff5e --- /dev/null +++ b/ManualTests/caret-image.html 
@@ -0,0 +1,9 @@ +<p> +Test to see if caret works correctly to the right of an image. +If the test is successful, the caret will look thin as usual. +If the test fails, the caret will be a big black box the size of the image. +</p> + +<div id="test" contenteditable="true">free<img src="resources/webkit-background.png">lunch</div> + +<script>window.getSelection().setPosition(document.getElementById("test"), 2);</script> 
diff --git a/ManualTests/caret-in-columns-flipped.html b/ManualTests/caret-in-columns-flipped.html new file mode 100644 index 0000000..b2be4f2 --- /dev/null +++ b/ManualTests/caret-in-columns-flipped.html 
@@ -0,0 +1,25 @@ +<p> + (Read from bottom to top) +</p> +<div id="target" style=" + margin: 100px; + -webkit-columns: 3; + width: 300px; + height: 100px; + -webkit-user-modify: read-write; + -webkit-writing-mode: horizontal-bt; + outline: none; +"> + <br> + <br> + <br> + <br> + <br> + <br> + The blinking insertion point should be here &rarr; +</div> +<script> + var target = document.getElementById("target"); + target.focus(); + getSelection().modify("move", "forward", "documentboundary"); +</script> 
diff --git a/ManualTests/caret-in-columns.html b/ManualTests/caret-in-columns.html new file mode 100644 index 0000000..3941508 --- /dev/null +++ b/ManualTests/caret-in-columns.html 
@@ -0,0 +1,21 @@ +<div id="target" style=" + margin: 100px; + -webkit-columns: 3; + width: 300px; + height: 100px; + -webkit-user-modify: read-write; + outline: none; +"> + <br> + <br> + <br> + <br> + <br> + <br> + The blinking insertion point should be here &rarr; +</div> +<script> + var target = document.getElementById("target"); + target.focus(); + getSelection().modify("move", "forward", "documentboundary"); +</script> 
diff --git a/ManualTests/caretScrolling.html b/ManualTests/caretScrolling.html new file mode 100644 index 0000000..6fb8044 --- /dev/null +++ b/ManualTests/caretScrolling.html 
@@ -0,0 +1,18 @@ +<html> +<p>Manual test for fix for <a href="rdar://problem/3690705">rdar://problem/3690705</a> "caret does not move when scrolling overflow: auto editable area"</p> +<p> +Click inside the block below, a caret should appear. Grab the block's scroll handle and scroll down. The caret blinks, try to grab the scroll handle while the caret is visible. The caret should scroll and disappear when it reaches the block's border. +</p> + +<div contentEditable style="border: 1px solid blue; height: 100px; overflow:scroll;"> +one<br> +two<br> +three<br> +four<br> +five<br> +six<br> +seven<br> +eight<br> +</div> + +</html> \ No newline at end of file 
diff --git a/ManualTests/chrome-bidi-text.html b/ManualTests/chrome-bidi-text.html new file mode 100644 index 0000000..99c0a7b --- /dev/null +++ b/ManualTests/chrome-bidi-text.html 
@@ -0,0 +1,5 @@ +<p> + This tests drawing bidirectional text in Windows Safari chrome. Click the + Start button and follow the instructions. +</p> +<button onclick='open("resources/chrome-bidi-text-window.html", null, "toolbar=no")'>Start</button> \ No newline at end of file 
diff --git a/ManualTests/chromium/autofill-popup-shiftupdown.hml b/ManualTests/chromium/autofill-popup-shiftupdown.hml new file mode 100644 index 0000000..e5c15c6 --- /dev/null +++ b/ManualTests/chromium/autofill-popup-shiftupdown.hml 
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<body> +<h3>Test shift + up/down keys work fine even when autofill popup window is shown.</h3> +<ol> +<li> Type the text 'hogehoge' in the following text input area. And press ENTER to submit. </li> +<li> Return to this page. </li> +<li> Type the text 'hoge' and make sure autofill popup window is shown. </li> +<li> Move back the cursor two steps at the center between 'o' and 'g'.</li> +<li> Press 'shift + up' key and make sure the 'ho' is selected even when autofill popup window is shown.</li> +<li> Press 'shift + down' key and make sure the 'ge' is selected even when autofill popup window is shown.</li> +<li> Use control/alt/command(only on Mac) modifier and check if they work fine too.</li> +</ol> +<form><input name=p autofocus></form> +</body> +</html> 
diff --git a/ManualTests/chromium/drag-image-accounts-for-device-scale.html b/ManualTests/chromium/drag-image-accounts-for-device-scale.html new file mode 100644 index 0000000..d8751fb --- /dev/null +++ b/ManualTests/chromium/drag-image-accounts-for-device-scale.html 
@@ -0,0 +1,12 @@ +<html> +<body> + <p>To test device scale, run chrome with --force-device-scale-factor=2 (or run chrome on a device with > 1 device scale, such as a macbook running in high dpi mode)</p> + <p>Select some text and start dragging. If the text in the drag image is rendered at the same size as the text on the page and is not blurry (due to scaling), 1st part of this test passes.</p> + <p>For 2nd part, try dragging "Drag me" below. Again, if the text in the drag image is rendered at the same size as the text on the page is not blurry, the test passes.</p> + <div draggable='true' id='dragme'> + Drag me + </div> + <p>Lastly, for testing dragging of images, drag the image below. If drag image is exactly the same size as the image on the page, the test passes.</p> + <img src="../resources/apple.jpg" width="50" height="50"> +</body> +</html> 
diff --git a/ManualTests/chromium/modifiers-during-drag-and-drop.html b/ManualTests/chromium/modifiers-during-drag-and-drop.html new file mode 100644 index 0000000..72136bb --- /dev/null +++ b/ManualTests/chromium/modifiers-during-drag-and-drop.html 
@@ -0,0 +1,26 @@ +<html> +<head> +<script> + function logDrag(e) { + var l = document.getElementById('log'); + l.innerHTML += 'shiftKey=' + e.shiftKey + ' ctrlKey=' + e.ctrlKey + ' altKey=' + e.altKey + ' metaKey=' + e.metaKey + '\n'; + e.preventDefault(); + } + + document.addEventListener('DOMContentLoaded', function() { + document.addEventListener('dragenter', logDrag, false); + document.addEventListener('dragover', logDrag, false); + document.addEventListener('dragleave', logDrag, false); + document.addEventListener('drop', logDrag, false); + }); +</script> +</head> + +<body> + <p>Drag the "Drag me" with any modifier keys pressed (Shift/Ctrl/Alt) and see if the log messages have the correct modifier state</p> + <div draggable='true' id='dragme'> + Drag me + </div> + <pre id='log'></pre> +</body> +</html> 
diff --git a/ManualTests/chromium/no-autofill-on-readonly.html b/ManualTests/chromium/no-autofill-on-readonly.html new file mode 100644 index 0000000..9724aaa --- /dev/null +++ b/ManualTests/chromium/no-autofill-on-readonly.html 
@@ -0,0 +1,33 @@ +<html> +<head> +</head> +<body> + <p>This page tests that the autofill popup is not shown for read-only and disabled text inputs.</p> + <p>Do the following:</p> + <ul> + <li>Enter a name in the input text in Form 1 and press submit. This is so the autofill has a value for that field.</li> + <li>Reload the page so the input text is empty. Click twice on the Form 1 text input. An autofill popup with the name you entered previously should be shown.</li> + <li>Click twice on the Form 2 text input. No autofill popup should be shown.</li> + <li>Click twice on the Form 3 text input. No autofill popup should be shown.</li> + </ul> + + <h1>Form 1 (text input non read-only)</h1> + <form action="no-autofill-on-readonly.html"> + Name:<input type="text" name="name"></input><br> + <input type="submit"></input> + </form> + + <h1>Form 2 (text input read-only)</h1> + <form action="no-autofill-on-readonly.html"> + Name:<input type="text" name="name" READONLY></input><br> + <input type="submit"></input> + </form> + + <h1>Form 3 (text input disabled)</h1> + <form action="no-autofill-on-readonly.html"> + Name:<input type="text" name="name" DISABLED></input><br> + <input type="submit"></input> + </form> + +</body> +</html> 
diff --git a/ManualTests/chromium/onchange-reload-popup.html b/ManualTests/chromium/onchange-reload-popup.html new file mode 100644 index 0000000..ce8f21e --- /dev/null +++ b/ManualTests/chromium/onchange-reload-popup.html 
@@ -0,0 +1,44 @@ +<html> +<head> + <script type="text/javascript">  + + function addEvent(obj, evType, fn) { + if (obj.addEventListener){ + obj.addEventListener(evType, fn, false); + return true; + } else if (obj.attachEvent){ + var r = obj.attachEvent("on"+evType, fn); + return r; + } else { + return false; + } + } + + function reloadSelect() { + var container = document.getElementById('container'); + container.innerHTML = '<select id="menu"> \ + <option value="abcd">abcd</option>\ + <option value="defg">efgh</option>\ + </select>'; + + var menu = document.getElementById('menu'); + addEvent(menu, 'change', reloadSelect); + } + + </script> +</head> +<body> + <p>Do the following and see if Chromium crashes.</p> + <ul> + <li>Click the select</li>  + <li>Press 'e' on your keyboard</li>  + <li>Click on the document but not the select itself.</li> + </ul> + + <div id="container"/> + <script> + reloadSelect() + </script> + </div>  +</body> +</html> 
diff --git a/ManualTests/chromium/popup-menu-crash.html b/ManualTests/chromium/popup-menu-crash.html new file mode 100644 index 0000000..ef0e7a5 --- /dev/null +++ b/ManualTests/chromium/popup-menu-crash.html 
@@ -0,0 +1,24 @@ +<body id="body"> +This is a test for https://bugs.webkit.org/show_bug.cgi?id=64295. Chromium sometimes crashes in a mouse event on an HTMLSelectElement if the event handler removes the element from the DOM. +This test is manual because it requires a real select popup menu, which DRT doesn't provide.<br> +To run, click on the select below, then select "Click me!" on the dropdown menu. We pass if the HTMLSelectElement disappears and we don't crash. +<script> +function handleClick(e) { + if (e.target.selectedIndex != 1) + return; + + document.getElementById("body").removeChild(document.getElementById("formDiv")); + var xhr = new XMLHttpRequest(); + xhr.open('GET', '', true); + xhr.send(null); +} +</script> +<div id="formDiv"> +<form> +<select onmouseup="handleClick(event);"> +<option></option> +<option>Click me!</option> +</select> +</form> +</div> +</body> 
diff --git a/ManualTests/chromium/select-close-popup-value-change.html b/ManualTests/chromium/select-close-popup-value-change.html new file mode 100644 index 0000000..f2adf61 --- /dev/null +++ b/ManualTests/chromium/select-close-popup-value-change.html 
@@ -0,0 +1,20 @@ +<html> +<head> +</head> +<body> + <p>Do the following, the test passes if the select keeps the selected value after step 4, fails if the value reverted.</p> + <ul> + <li>1. Click the select to open the popup list.</li>  + <li>2. Use keyboard to select a value by pressing the first letter of the value.</li>  + <li>3. Click the select again to close the popup list, it should stay at the value from step 2.</li>  + <li>4. Click anywhere else on the page to move the focus out of the select.</li> + </ul> + + <select> + <option>0</option> + <option>1</option> + <option>2</option> + <option>3</option> + </select> +</body> +</html> 
diff --git a/ManualTests/chromium/suggestions-popup-font-change.html b/ManualTests/chromium/suggestions-popup-font-change.html new file mode 100644 index 0000000..b85977a --- /dev/null +++ b/ManualTests/chromium/suggestions-popup-font-change.html 
@@ -0,0 +1,21 @@ +<html> +<head> +</head> +<body> + <p>Verify that the font size in the suggestion popup matches the corresponding + input field, test passes if step 2 matches expected behavior.</p> + <ul> + <li>1. Type "abcd" in the text form and press enter.</li> + <li>2. Type "a" in the text form, suggestions popup should appear. + Verify that font size of text in suggestion popup is the same as in + the corresponding input form. + </li> + <li>3. Delete contents of input box, press Cntrl/+ [Command/+ on Mac] + to magnify the page contents. Repeat step 2, text size should still + match. </li> + </ul> + <form method="get" action="suggestions-popup-font-change.html" id="form"> + <input name="s" id="s" style="font-size:x-large"> + </form> +</body> +</html> 
diff --git a/ManualTests/clear-input-file.html b/ManualTests/clear-input-file.html new file mode 100644 index 0000000..f1ef360 --- /dev/null +++ b/ManualTests/clear-input-file.html 
@@ -0,0 +1,27 @@ +<script> +function clearWithReset() +{ + document.getElementById("form").reset(); +} +function clearBySettingValue() +{ + document.getElementById("file").value = ""; +} +function clearBySettingValueToNull() +{ + document.getElementById("file").value = null; +} +function clearBySettingValueToX() +{ + document.getElementById("file").value = "x"; +} +</script> +<p>Use this to test the various ways you can clear an input type=file element.</p> +<form id="form"> +<p>Choose a file here: <input type="file" id="file"></input></p> +<p>Then press one of these buttons, that should clear the file: +<input type="button" value="clear with reset()" onclick="clearWithReset()"> +<input type="button" value="clear by setting value to ''" onclick="clearBySettingValue()"></p> +<p>Or press this button that should clear the file, but won't, due to <a href="http://bugs.webkit.org/show_bug.cgi?id=13448">bug 13448</a>: <input type="button" value="clear by setting value to null" onclick="clearBySettingValueToNull()"></p> +<p>Or press this button to verify we can't set to a non-empty value: <input type="button" value="clear by setting value to 'x'" onclick="clearBySettingValueToX()"></p> +</form> 
diff --git a/ManualTests/clearTimeout-crash-bug29832.html b/ManualTests/clearTimeout-crash-bug29832.html new file mode 100644 index 0000000..d9ec5c7 --- /dev/null +++ b/ManualTests/clearTimeout-crash-bug29832.html 
@@ -0,0 +1,20 @@ +<script> +var w; +function clear() { + w.clearTimeout(153); +} + +function test() { + w = window.open("data:text/html,"+ + "<script>" + + "function navigate() { location.href='data:text/html,<body>Close this page and wait.</body>'};" + + "setTimeout(navigate,0);</" +  + "script>"); + + setInterval(clear, 0); +} +</script> +<body> +<p>This test reproduces the crash in DOMWindow::clearTimeout that happens when DOMWindow is disconnected from the Frame (as in back/forward cache expiration case tested here). +<p>This is the link to the bug: <a href="https://bugs.webkit.org/show_bug.cgi?id=29832">https://bugs.webkit.org/show_bug.cgi?id=29832</a> +<p>To reproduce the crash, click the link below, the popup window opens, which will immediately navigate to another one, so the b/f cache entry will be created. Close the popup window. Wait a few seconds (~10), for the page cache to start deleting pages it doesn't need - crash will happen.<br><a href="javascript:test()">Crash me!</a> 
diff --git a/ManualTests/close-on-closedWindow.html b/ManualTests/close-on-closedWindow.html new file mode 100644 index 0000000..9e30715 --- /dev/null +++ b/ManualTests/close-on-closedWindow.html 
@@ -0,0 +1,39 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4094363">rdar://problem/4094363</a> Can't re-open a window at capripalace.com website because "close" fails on already-closed window</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ol> + <li>Click the link below </li> + <li>Close the window that opens </li> + <li>Click the link again </li> +</ol> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +If the bug is fixed, a window WILL OPEN after Step #3. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If the bug is not fixed, a window WILL NOT OPEN after Step #3. +</p> + +<script language="JavaScript"> +win = null; +function win_open() { + + if (win != null) { + win.close(); + } + win = window.open('about:blank'); +} +</script> + + <a href="javascript:win_open();">Click this link</a> + +</body> +</html> 
diff --git a/ManualTests/compositing/accel-comp-iframe-tab-repaint.html b/ManualTests/compositing/accel-comp-iframe-tab-repaint.html new file mode 100644 index 0000000..35c9c34 --- /dev/null +++ b/ManualTests/compositing/accel-comp-iframe-tab-repaint.html 
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>Accelerated compositing tab repaint bug</title> +<style> +body { + background-color: yellow; +} +</style> +<h1>Accelerated compositing tab repaint bug</h1> +<p>This test case checks for a repaint bug resulting from accelerated +compositing of iframes on Mac. Follow these steps:</p> +<ol> +<li>Open <a href="resources/tab-repaint-part-2.html">this link</a> in a new tab.</li> +<li>Close this tab.</li> +<li>The new page should be blue.</li> +</ol> 
diff --git a/ManualTests/compositing/assert-on-tab-switch.html b/ManualTests/compositing/assert-on-tab-switch.html new file mode 100644 index 0000000..77814ee --- /dev/null +++ b/ManualTests/compositing/assert-on-tab-switch.html 
@@ -0,0 +1,20 @@ +<!DOCTYPE html> + +<html> +<head> + <style type="text/css" media="screen"> + .box { + width: 100px; + height: 100px; + background-color: blue; + transform: translateZ(0); + } +  + </style> +</head> +<body> + <div class="box"></div> + <p><a href="https://bugs.webkit.org/show_bug.cgi?id=43167">https://bugs.webkit.org/show_bug.cgi?id=43167</a><br> + You should not hit an assertion if you load this file in a tab, then switch back and forth between other tabs.</p> +</body> +</html> 
diff --git a/ManualTests/compositing/caret-in-compositing-frame.html b/ManualTests/compositing/caret-in-compositing-frame.html new file mode 100644 index 0000000..703f3b2 --- /dev/null +++ b/ManualTests/compositing/caret-in-compositing-frame.html 
@@ -0,0 +1,7 @@ +<style type="text/css" media="screen"> + iframe { + border: 1px solid black; + width: 400px; + } +</style> +<iframe src="resources/editable-compositing-subframe.html" scrolling="no"></iframe> 
diff --git a/ManualTests/compositing/fixed-position-out-of-view-scroll-prepaint.html b/ManualTests/compositing/fixed-position-out-of-view-scroll-prepaint.html new file mode 100644 index 0000000..f34c4aa --- /dev/null +++ b/ManualTests/compositing/fixed-position-out-of-view-scroll-prepaint.html 
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> +<head> + <style> + body { + height: 2000px; + margin: 0px; + padding: 0px; + } + .main { + position: fixed; + } + .fixed { + position: fixed; + width: 100%; + height: 100px; + left: 0px; + bottom: -100px; + background-color: red; + } + </style> +</head> + +<body> + <div class="main"> + This test is applicable on platforms that do accelerated compositing, can prepaint out-of-view contents and can scroll the contents into the viewport without repainting them.<p> + The following settings need to be enabled:<p> + - preferCompositingToLCDTextEnabled<br> + - fixedPositionCreatesStackingContext<p> + To test, scroll the page up and down. The test passes if there is no temporary or permanent red in the page. + </div> + + <!-- An out-of-view fixed element that should be never visible --> + <div class="fixed"></div> +</body> +</html> + 
diff --git a/ManualTests/compositing/font-smoothing.html b/ManualTests/compositing/font-smoothing.html new file mode 100644 index 0000000..00ddfd3 --- /dev/null +++ b/ManualTests/compositing/font-smoothing.html 
@@ -0,0 +1,34 @@ +<!DOCTYPE html> + +<html> + <style type="text/css" media="screen"> + div { + margin: 20px; + font-size: 24pt; + } + + .composited { + transform: translateZ(0); + background-color: white; + } +  + .smoothed { + -webkit-font-smoothing: subpixel-antialiased; + } + </style> +<head> +</head> +<body> + <div class="composited"> + This text should be antialiased, but not smoothed. + </div> + + <div class="smoothed composited"> + This text should be antialiased and smoothed. + </div> + + <div> + This text should be antialiased and smoothed in the browser, and antialiased in pixel results. + </div> +</body> +</html> 
diff --git a/ManualTests/compositing/missing-iframe-contents.html b/ManualTests/compositing/missing-iframe-contents.html new file mode 100644 index 0000000..e60437c --- /dev/null +++ b/ManualTests/compositing/missing-iframe-contents.html 
@@ -0,0 +1,33 @@ +<!DOCTYPE html> + +<html> +<head> + <style type="text/css" media="screen"> + iframe { + border: 10px solid black; + padding: 5px; + margin: 20px; + height: 150px; + width: 300px; + -webkit-box-shadow: 0 0 20px black; + transform: translateZ(0); + } +  + </style> + <script type="text/javascript" charset="utf-8"> + function doTest() + { + document.getElementById('iframe').className = 'dummy'; + } +  + window.addEventListener('load', doTest, false); + </script> +</head> +<body> + + <iframe id="iframe" src="resources/composited-subframe.html"></iframe> +  + <p><a href="https://bugs.webkit.org/show_bug.cgi?id=42046">https://bugs.webkit.org/show_bug.cgi?id=42046</a><br> + You should see a blue rectangle inside the iframe when the page loads.</p> +</body> +</html> 
diff --git a/ManualTests/compositing/requires-backing-change.html b/ManualTests/compositing/requires-backing-change.html new file mode 100644 index 0000000..94ba59e --- /dev/null +++ b/ManualTests/compositing/requires-backing-change.html 
@@ -0,0 +1,52 @@ +<!DOCTYPE html> + +<html> +<head> + <style> + #container, #container2 { + height: 100px; + width: 100px; + margin: 10px 0; + -webkit-perspective: 1000px; + } +  + #container.transformed, #container2.transformed { + transform: translateX(0); + } +  + .box { + margin-bottom: 5px; + height: 100px; + width: 100px; + background-color: green; + opacity: 0.5; + } + </style> + <script> + function doTest() + { + window.setTimeout(function() { + document.getElementById('container').className = 'transformed'; + document.getElementById('container2').className = ''; +  + if (window.layoutTestController) + layoutTestController.notifyDone(); + }, 100); + } + window.addEventListener('load', doTest, false); + </script> +</head> +<body> + <p>All squares should have the same pale green color></p> + <div class="box"></div> + <div id="container"> + <div class="box"> + </div> + </div> + + <div id="container2" class="transformed"> + <div class="box"> + </div> + </div> +</body> +</html> 
diff --git a/ManualTests/compositing/resources/composited-subframe.html b/ManualTests/compositing/resources/composited-subframe.html new file mode 100644 index 0000000..92b3b7f --- /dev/null +++ b/ManualTests/compositing/resources/composited-subframe.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE html> + +<html> +<head> + <style type="text/css" media="screen"> + body { background-color:silver } +  + .box { + height: 200px; + width: 200px; + margin: 10px; + padding: 5px; + background-color: blue; + transform: translateZ(0); + overflow:hidden; + } + .box:hover { + transform: none; + } + </style> +</head> +<body> + + <div id="iframe-content" class="box"> + </div> + +</body> +</html> 
diff --git a/ManualTests/compositing/resources/editable-compositing-subframe.html b/ManualTests/compositing/resources/editable-compositing-subframe.html new file mode 100644 index 0000000..8325e01 --- /dev/null +++ b/ManualTests/compositing/resources/editable-compositing-subframe.html 
@@ -0,0 +1,9 @@ +<style type="text/css" media="screen"> + #editable { + height: 100px; + transform: translateZ(0px); + } +</style> +<div id="editable" contenteditable="true"> +The caret should blink correctly when editing this paragraph. +</div> 
diff --git a/ManualTests/compositing/resources/flash-frame.html b/ManualTests/compositing/resources/flash-frame.html new file mode 100644 index 0000000..34d9290 --- /dev/null +++ b/ManualTests/compositing/resources/flash-frame.html 
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<title>Flash frame for repaint test</title> +<embed src="../../resources/spinbox.swf"> 
diff --git a/ManualTests/compositing/resources/tab-repaint-part-2.html b/ManualTests/compositing/resources/tab-repaint-part-2.html new file mode 100644 index 0000000..17cb6e7 --- /dev/null +++ b/ManualTests/compositing/resources/tab-repaint-part-2.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>Accelerated compositing tab repaint bug part 2</title> +<style> +body { + background-color: royalblue; +} +iframe { + border-width: 0px; + width: 400px; + height: 200px; +} +</style> +<body> +<ol> +<li>This page should have a blue background.</li> +</ol> +<iframe src="../resources/flash-frame.html"></iframe> +</body> 
diff --git a/ManualTests/compositing/show-composited-iframe-on-back-button.html b/ManualTests/compositing/show-composited-iframe-on-back-button.html new file mode 100644 index 0000000..921cc10 --- /dev/null +++ b/ManualTests/compositing/show-composited-iframe-on-back-button.html 
@@ -0,0 +1,76 @@ +<!DOCTYPE html> + +<html> +<head> + <!-- + This content was originally intended as a layout test, but the sequencing performed by  + queueBackNavigation/queueForwardNavigation differs somehow from what occurs when hitting  + the back and forward buttons, so the error does not occur. I've left all the LayoutTestController  + logic in the test in case this is fixed in the future. + --> +  + <title>Show composited iframe contents when navigating back to page</title> + <style type="text/css" media="screen"> + #box { + background-color: red; + width: 100px; + height: 100px; + transform: translateZ(0); + } + iframe { + margin: 20px; + height: 250px; + width: 250px; + border: 1px solid black; + } +  + .composited { + transform: translateZ(0); + } +  + </style> + <script type="text/javascript" charset="utf-8"> + var dumpLayerTree = function() + { + if (window.layoutTestController) { + document.getElementById('layers').innerHTML += "Layer Tree after\n\n"+layoutTestController.layerTreeAsText()+"\n\n"; + } + } +  + if (window.layoutTestController) { + layoutTestController.dumpAsText(); + } +  + function onPageShow(evt) + { + if (!evt.persisted && window.layoutTestController) { + // this is the first time the page has been loaded, then setup the + // to-be-tested scenario. + document.getElementById('layers').innerHTML = "Layer Tree before\n\n"+layoutTestController.layerTreeAsText()+"\n\n"; + layoutTestController.queueLoad("resources/subframe.html"); + layoutTestController.queueBackNavigation(1); + layoutTestController.queueForwardNavigation(1); + layoutTestController.queueBackNavigation(1); + layoutTestController.queueNonLoadingScript("dumpLayerTree()"); + } + } + + window.onpageshow = onPageShow; + </script> +</head> +<body> +<p> + This page has a composited iframe. When navigating to a new page and then back to this one, the iframe contents should show up. +</p> + Click on the following URL and then click back. When navigating back to this page, the blue box inside the black rectangle + should show up. +</p> +<pre> + <a href="http://apple.com">http://apple.com</a> +</pre> + <div id=box></div> + <iframe id="iframe" scrolling="no" src="resources/composited-subframe.html"></iframe> +<br> +<pre id="layers"></pre> +</body> +</html> 
diff --git a/ManualTests/computed-transform-value.html b/ManualTests/computed-transform-value.html new file mode 100644 index 0000000..cea435c --- /dev/null +++ b/ManualTests/computed-transform-value.html 
@@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Get Computed Transform</title> + <style type="text/css" media="screen"> + .box { + height: 200px; + width: 200px; + background-color: #00a0a0; + } + </style> + <script type="text/javascript" charset="utf-8"> + function printTransform(event) + { + var box = event.target; + var computedTransform = window.getComputedStyle(box).webkitTransform; + document.getElementById("output").innerHTML = 'Computed transform is ' + computedTransform; + } +  + </script> +</head> +<body onclick="printTransform(event)"> + +<h1>Testing transform computed style</h1> +<p>All boxes are 200x200 pixels. When you click on an element, the computed transform style will be displayed below</p> +<p id="output">Computed style for transform displayed here</p> + + +<div class="box" style="position: absolute; left: 100px; top: 200px; transform: scale(1.5, 0.75)"> + scale(1.5, 0.75) +</div> + +<div class="box" style="position: absolute; left: 400px; top: 200px; transform: rotate(30deg)"> + rotate(30deg) +</div> + +<div class="box" style="position: absolute; left: 100px; top: 400px; transform: translate(50px, 80px)"> + translate(50px, 80px) +</div> + +<div class="box" style="position: absolute; left: 400px; top: 400px; transform: translate(10px, 50px) scale(0.8) rotate(-10deg)"> + translate(10px, 50px) scale(0.8) rotate(-10deg) +</div> + +</body> +</html> 
diff --git a/ManualTests/containing-block-position-change.html b/ManualTests/containing-block-position-change.html new file mode 100644 index 0000000..adc2238 --- /dev/null +++ b/ManualTests/containing-block-position-change.html 
@@ -0,0 +1,35 @@ +<html> +<head> + <title></title> + <style type="text/css"> + #t { position: absolute; width: 100px; height: 100px; background: green; left: -120px; } + </style> + <script type="text/javascript"> + function test() + { + var container = document.getElementById("rel"); + var target = document.getElementById("t"); + document.body.offsetTop; // force layout + container.style.position = "relative"; + document.body.offsetTop; // force layout + target.style.left = "0"; + } + </script> +</head> +<body onload="test()"> + <p> + This is a test for <i><a href="http://bugs.webkit.org/show_bug.cgi?id=9121">http://bugs.webkit.org/show_bug.cgi?id=9121</a> + REGRESSION: [Incremental Repaint] DHTML movement test failures</i>. + </p> + <p> + Do not resize the window. If you did, reload the test. + </p> + <p> + There should be a green square below, aligned with the left margin of the page. + </p> + <hr> + <div id="rel" style="position: static;"> + <span id="t"></span> + </div> +</body> +</html> 
diff --git a/ManualTests/contenteditable-link.html b/ManualTests/contenteditable-link.html new file mode 100644 index 0000000..9923aa9 --- /dev/null +++ b/ManualTests/contenteditable-link.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> +<TITLE> Webkit bugzilla repro movie: #7156 </TITLE> +<META NAME="Author" CONTENT="Aldo Hoeben"> +<style type="text/css"> +#editable { + width: 40em; + height: 10em; + border: 1px solid black; +} +</STYLE> +</HEAD> + +<BODY> +<P>Repro movie for bug <a href="http://bugs.webkit.org/show_bug.cgi?id=7156">#7156</a></P> + +<div>The behaviour of editable links is controlled by the user default WebKitEditableLinkBehavior. This can be set via a private WebPreference. If the preference is OnlyLiveWithShiftKey, then the link will only be active when the shift key is pressed (WinIE/Firefox behaviour). If the preference is WebKitEditableLinkAlwaysLive or WebKitEditableLinkDefaultBehavior, then the link is always active (Safari 2.0 behaviour). Finally, if the preference is WebKitEditableLinkLiveWhenNotFocused, the link will only be live if the selection before clicking on the link is not in the same editable block as the link.</div> + +<div>Also, when a link is 'live' it can be dragged as a link, and when the link isn't 'live', dragging a link just performs a normal text selection. +</div> + +<div id="editable" contentEditable="true"> + <p>Test content</p> + <p><a href="about:blank">Test link</a></p> +</div> + +</BODY> +</HTML> 
diff --git a/ManualTests/context-click-generated-content.html b/ManualTests/context-click-generated-content.html new file mode 100644 index 0000000..3fcaf6d --- /dev/null +++ b/ManualTests/context-click-generated-content.html 
@@ -0,0 +1,21 @@ +<style type="text/css"> +html:before, html:after { +	content: ""; +	width: 50px; +	height: 50px; +	position: fixed; +} +html:before { +	border: solid red 5px; +} +html:after { +	border: solid green 5px; +	top: 60px; +} +</style> + +<p> +Test of crash when context-clicking on generated content. +Do a control-click or a right-click in one of these two +boxes, and make sure you don't see a crash. +</p> 
diff --git a/ManualTests/context-click-unfocused-frame.html b/ManualTests/context-click-unfocused-frame.html new file mode 100644 index 0000000..3e94e85 --- /dev/null +++ b/ManualTests/context-click-unfocused-frame.html 
@@ -0,0 +1,17 @@ +<frameset cols="*"> + <frame src="data:text/html, + <script> + function contextMenu() + { + document.getElementById('result').appendChild(document.createTextNode('PASS')); + } + </script> + <body onmousedown='return false;' oncontextmenu='contextMenu(); return false;'> + <p> + Control-click (Mac) or right-click (Windows) below. The word  + %26ldquo;PASS%26rdquo; should appear. A contextual menu should not open. + </p> + <p id='result'></p> + </body> + "> +</frameset> 
diff --git a/ManualTests/context-menu-during-drag-selection.html b/ManualTests/context-menu-during-drag-selection.html new file mode 100644 index 0000000..4710d87 --- /dev/null +++ b/ManualTests/context-menu-during-drag-selection.html 
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<body> +<p>Simple manual behavior test for the interaction between selection drags, +context menu invocation, and actual dragging. In order to test, simply start +selecting a span of text by clicking and dragging. During text selection, no +drag should start. While selecting text, press and hold the right mouse button +to invoke the context menu, then release the right mouse button over a context +menu entry like "Copy". After this, if you keep moving the mouse around, no drag +of the selected text should start, even though the left mouse button is still +held down. +</body> +</html> 
diff --git a/ManualTests/cookieSpeedTest.html b/ManualTests/cookieSpeedTest.html new file mode 100644 index 0000000..8633557 --- /dev/null +++ b/ManualTests/cookieSpeedTest.html 
@@ -0,0 +1,28 @@ +<html><head><title>Cookie Test</title> +<script> +function cookieTest(){ + var totalW = 0.0; + var totalR = 0.0; + var numLoops = 100; + for(var i=0; i < numLoops; i++){ + var randomNumber=Math.floor(Math.random()*11); + var time = new Date(); + time.setTime(time.getTime() + 1000); + var cookieString = "cookie" + randomNumber + "=true; expires=" + time.toGMTString(); + var preW = new Date().getTime(); + document.cookie = cookieString; + var postW = new Date().getTime(); + if(document.cookie.indexOf(("cookie" + randomNumber)> 0)); + var postR = new Date().getTime(); + totalW += (postW - preW); + totalR += (postR - postW); + } + document.write("<br><br>avg R(millis):" + totalR/numLoops); + document.write("<br>avg W(millis):" + totalW/numLoops); +} + +</script> +</head> +<body onload="javascript:cookieTest();setTimeout(cookieTest(), 1000);"> +</body> +</html> 
diff --git a/ManualTests/crash-and-no-repaint-after-wake-from-sleep.html b/ManualTests/crash-and-no-repaint-after-wake-from-sleep.html new file mode 100644 index 0000000..60ac434 --- /dev/null +++ b/ManualTests/crash-and-no-repaint-after-wake-from-sleep.html 
@@ -0,0 +1,186 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>Test for Bugs 39295 and 39297</title> + <meta http-equiv="refresh" content="5"> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <meta name="viewport" content="initial-scale=0.60, minimum-scale=0.60, maximum-scale=0.60"> + <style type="text/css"> + + body { + font-family: 'Lucida Grande', Verdana, Arial; + font-size: 12px; + } + + #stage { + margin: 150px auto; + width: 600px; + height: 400px; + /* +  + Setting the perspective of the contents of the stage + but not the stage itself +  + */ + -webkit-perspective: 800; + } + + #rotate { + margin: 0 auto; + width: 600px; + height: 400px; + /* Ensure that we're in 3D space */ + -webkit-transform-style: preserve-3d; + /* + Make the whole set of rows use the x-axis spin animation + for a duration of 7 seconds, running infinitely and linearly + */ + -webkit-animation-name: x-spin; + -webkit-animation-duration: 7s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + + .ring { + margin: 0 auto; + height: 110px; + width: 600px; + -webkit-transform-style: preserve-3d; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } +  + .ring > :nth-child(odd) { + background-color: #995C7F; + } + + .ring > :nth-child(even) { + background-color: #835A99; + } + + .poster { + position: absolute; + left: 250px; + width: 100px; + height: 100px; + opacity: 0.7; + color: rgba(0,0,0,0.9); + -webkit-border-radius: 10px; + } +  + .poster > p { + font-family: 'Georgia', serif; + font-size: 36px; + font-weight: bold; + text-align: center; + margin-top: 28px; + } + + /* + Set up each row to have a different animation duration + and alternating y-axis rotation directions. + */ + #ring-1 { + -webkit-animation-name: y-spin; + -webkit-animation-duration: 5s; + } + + #ring-2 { + -webkit-animation-name: back-y-spin; + -webkit-animation-duration: 4s; + } + + #ring-3 { + -webkit-animation-name: y-spin; + -webkit-animation-duration: 3s; + } + + /* + + Here we define each of the three individual animations that + we will be using to have our 3D rotation effect. The first + animation will perform a full rotation on the x-axis, we'll + use that on the whole set of objects. The second and third + animations will perform a full rotation on the y-axis in + opposite directions, alternating directions between rows. +  + Note that you currently have to specify an intermediate step + for rotations even when you are using individual transformation + constructs. + + */ + @-webkit-keyframes x-spin { + 0% { transform: rotateX(0deg); } + 50% { transform: rotateX(180deg); } + 100% { transform: rotateX(360deg); } + } + + @-webkit-keyframes y-spin { + 0% { transform: rotateY(0deg); } + 50% { transform: rotateY(180deg); } + 100% { transform: rotateY(360deg); } + } + + @-webkit-keyframes back-y-spin { + 0% { transform: rotateY(360deg); } + 50% { transform: rotateY(180deg); } + 100% { transform: rotateY(0deg); } + } + </style> + + <script type="text/javascript"> + + const POSTERS_PER_ROW = 12; + const RING_RADIUS = 200; + + function setup_posters (row) + { + var posterAngle = 360 / POSTERS_PER_ROW; + for (var i = 0; i < POSTERS_PER_ROW; i ++) { + var poster = document.createElement('div'); + poster.className = 'poster'; + // compute and assign the transform for this poster + var transform = 'rotateY(' + (posterAngle * i) + 'deg) translateZ(' + RING_RADIUS + 'px)'; + poster.style.webkitTransform = transform; + // setup the number to show inside the poster + var content = poster.appendChild(document.createElement('p')); + content.textContent = i; + // add the poster to the row + row.appendChild(poster); + } + + } + + function init () + { + setup_posters(document.getElementById('ring-1')); + setup_posters(document.getElementById('ring-2')); + setup_posters(document.getElementById('ring-3')); + } + + // call init once the document is fully loaded + window.addEventListener('load', init, false); + + </script> + </head> +  + <body> + + <p>This is a combined test for <a href="https://bugs.webkit.org/show_bug.cgi?id=39295">Bug 39295: Crash (preceded by + assertion) in WKCACFLayerRenderer::setNeedsDisplay when computer wakes from sleep on particular page</a> and <a + href="https://bugs.webkit.org/show_bug.cgi?id=39297">Bug 39297: WebView doesn't repaint until page reloads when page + using hardware acceleration loads just after waking from sleep</a>. To test, put your computer to sleep (or + "Standby", as Windows calls it). When you wake your computer up, the browser should not crash and the animation + below should still be running without any periods of non-painting of the WebView.</p> + <div id="stage"> + <div id="rotate"> + <div id="ring-1" class="ring"></div> + <div id="ring-2" class="ring"></div> + <div id="ring-3" class="ring"></div> + </div> + </div> + + </body> +  +</html> 
diff --git a/ManualTests/crash-on-accessing-domwindow-without-frame.html b/ManualTests/crash-on-accessing-domwindow-without-frame.html new file mode 100644 index 0000000..77dd115 --- /dev/null +++ b/ManualTests/crash-on-accessing-domwindow-without-frame.html 
@@ -0,0 +1,22 @@ +<script> +var w; +function clear() { + // Id doesn't matter, the crash happens while trying to access the NULL Document to lookup the Id. + w.clearTimeout(153); +} + +function test() { + w = window.open("data:text/html,"+ + "<script>" + + "function navigate() { location.href='data:text/html,<body>Close this page and wait.</body>'};" + + "setTimeout(navigate,0);</" +  + "script>"); + + setInterval(clear, 20); +} +</script> +<body><p>This test reproduces the crash that happens when JavaScript has access to DOMWindow which is disconnected from its Frame. This crash was fixed by http://trac.webkit.org/changeset/49786</p> +To reproduce the crash: +<ul><li>Click the link below, the popup window opens.</li><li>Close the popup window.</li><li>Wait about 10 seconds (~10, page cache should start deleting pages) and observe the crash.</li></ul> +Crashes on Safari 4.0.3</p><p><a href="javascript:test()">Crash me!</a></p> +</body> 
diff --git a/ManualTests/crash-on-find-with-no-selection.html b/ManualTests/crash-on-find-with-no-selection.html new file mode 100644 index 0000000..9dd108c --- /dev/null +++ b/ManualTests/crash-on-find-with-no-selection.html 
@@ -0,0 +1,12 @@ +<html> +<head> +</head> +<body> +<p>This test can be used to verify that we do not crash when searching for text on a page when nothing on the page is currently selected.</p> +<ol> + <li>Ensure that you have not clicked anywhere on this page and that nothing on this page is currently selected.</li> + <li>Search for the word &quot;crash&quot; in this page (In Safari for Mac, select Edit->Find->Find or press Cmd-F on your keyboard to open the Find banner to search for a word in the page). + <li>This test PASSED if we do not crash and the word &quot;crash&quot; is highlighted in at least the first sentence on this page.</li> +</ol> +</body> +</html> 
diff --git a/ManualTests/css3-cursor-fallback-quirks.html b/ManualTests/css3-cursor-fallback-quirks.html new file mode 100644 index 0000000..0efca75 --- /dev/null +++ b/ManualTests/css3-cursor-fallback-quirks.html 
@@ -0,0 +1,64 @@ +<html> +<head><title>Quirks custom cursor tests</title></head> +<body> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=8991">Bug .991</a>: REGRESSION: missing or broken CSS custom cursors are displayed as a missing image icon.</p> +<p>Move the cursor over the blue box - it should not turn into a missing image icon, and should turn into an I-beam over text.</p> + +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png), auto;"><span style="cursor:url(nonexistent.png), auto;">some text</span></div> +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png);"></div> + +<hr> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=6001">Bug 6001</a>: WebKit does not handle fallback custom cursors</p> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=9013">Bug 9013</a>: Let correct CSS custom cursor declarations parse</p> +<p>In each of the blue boxes below, the cursor should become a help cursor (question mark).</p> +<table><tr> + <td><div style="width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;"></div></td> <!-- Valid, no fallback needed --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff);'></div></td> <!-- Invalid, but allowed by WinIE --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), help;'></div></td> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), url(custom-cursors.html), url(unknown-scheme:custom-cursors.html), url(resources/helpCursor.tiff), text;'></div></td> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), url("resources/helpCursor.tiff"), text;'></div></td> +</tr> +</table> +<p>In each of the blue boxes below, the cursor should remain the default cursor, since all cursor definitions are invalid in quirks mode.</p> +<table><tr> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 1 text;'></div></td> <!-- CSS3 hot spot - invalid, should have comma after hotspot coords --> +</tr> +</table> +<p>In each of the blue boxes below, the cursor should show the text cursor, since they contain invalid hotspots.</p> +<table><tr> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1, text;'></div></td> <!-- CSS3 hot spot - ignored in IE --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 2 3, text;'></div></td> <!-- CSS3 hot spot - ignored in IE --> +</tr> +</table> + +<p>In each of the blue boxes below, the cursor should show the help, since they contain valid hotspots.</p> +<table><tr> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 2;'></div></td> <!-- CSS3 hot spot - ignored in IE --> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 2, text;'></div></td> <!-- CSS3 hot spot - ignored in IE --> +</tr> +</table> + +<p></p> +<p><span style='background-color:gray; cursor:url(nonexistent.png), url("resources/helpCursor.tiff");'>Should show an I-beam cursor.</span></p> <!-- An invalid declaration, even by WinIE standards --> +<p>The following testcases test inheritance of the cursor property. The first one should have the help cursor for both divs (normal inheritance). The second one should have help cursor for big div, text cursor for small div (inner div has cursor property, should not inherit). The next has invalid css syntax in the inner div, so it should inherit from the parent. The last two testcases have correct syntax and there is no inheritance in this case.</p> +<table> +<tr><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:text"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:foobar"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:url(resources/helpCursor.tiff) 1 2, text"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:url(nonexistant.png), text"></div></div> +</td></tr> +</table> +<p>In each of the blue boxes below, the hotspot is out-of-range. In quirks mode we do not support hotspots at all, so we show the fallback cursor(text).</p> +<table><tr> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) -1 -1, text;'></div></td> <!-- CSS3 hot spot out-of-range --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 100 100, text;'></div></td> <!-- CSS3 hot spot out-of-range --> +</tr> +</table> +</body> +</html> 
diff --git a/ManualTests/css3-cursor-fallback-strict.html b/ManualTests/css3-cursor-fallback-strict.html new file mode 100644 index 0000000..06624c4 --- /dev/null +++ b/ManualTests/css3-cursor-fallback-strict.html 
@@ -0,0 +1,56 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head><title>Strict custom cursor tests</title></head> +<body> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=8991">Bug .991</a>: REGRESSION: missing or broken CSS custom cursors are displayed as a missing image icon.</p> +<p>Move the cursor over the blue box - it should not turn into a missing image icon, and should turn into an I-beam over text.</p> + +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png), auto;"><span style="cursor:url(nonexistent.png), auto;">some text</span></div> +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png);"></div> + +<hr> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=6001">Bug 6001</a>: WebKit does not handle fallback custom cursors</p> +<p><a href="http://bugs.webkit.org/show_bug.cgi?id=9013">Bug 9013</a>: Let correct CSS custom cursor declarations parse</p> +<p>In each of the blue boxes below, the cursor should become a help cursor (question mark).</p> +<table><tr> + <td><div style="width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;"></div></td> <!-- Valid, no fallback needed --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), help;'></div></td> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), url(custom-cursors.html), url(unknown-scheme:custom-cursors.html), url(resources/helpCursor.tiff), text;'></div></td> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), url("resources/helpCursor.tiff"), text;'></div></td> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 1, text;'></div></td> <!-- CSS3 hot spot - valid, no fallback needed --> +</tr> +</table> +<p>In each of the blue boxes below, the cursor should remain the default cursor, since all cursor definitions are invalid in strict mode.</p> +<table><tr> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 1 text;'></div></td> <!-- CSS3 hot spot - invalid, should have comma after hotspot coords --> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1, text;'></div></td> <!-- CSS3 hot spot - invalid, should have two hotspot coords --> +<td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 1 2 3, text;'></div></td> <!-- CSS3 hot spot - invalid, should have two hotspot coords --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff);'></div></td> <!-- Invalid --> +</tr> +</table> + +<p></p> +<p><span style='background-color:gray; cursor:url(nonexistent.png), url("resources/helpCursor.tiff");'>Should show an I-beam cursor.</span></p> <!-- An invalid declaration, even by WinIE standards --> +<p>The following testcases test inheritance of the cursor property. The first one should have the help cursor for both divs (normal inheritance). The second one should have help cursor for big div, text cursor for small div (inner div has cursor property, should not inherit). The next two have invalid css syntax in the inner div, so they should inherit from parent. The rightmost testcase has a nonexistant url, but the syntax is correct, and there is no inheritance in this case.</p> +<table> +<tr><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:text"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:foobar"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:url(resources/helpCursor.tiff) 1 2 3, text"></div></div> +</td><td> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), text;'><div style="width:50px;height:50px;background-color:gray;cursor:url(nonexistant.png), text"></div></div> +</td></tr> +</table> +<p>In each of the blue boxes below, the hotspot is out-of-range. For now this means a failure to show the custom cursor(lower level problem?).</p> +<table><tr> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) -1 -1, help;'></div></td> <!-- CSS3 hot spot out-of-range --> + <td><div style='width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff) 100 100, help;'></div></td> <!-- CSS3 hot spot out-of-range --> +</tr> +</table> +</body> +</html> 
diff --git a/ManualTests/cur-hotspot.html b/ManualTests/cur-hotspot.html new file mode 100644 index 0000000..10c69c6 --- /dev/null +++ b/ManualTests/cur-hotspot.html 
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml"> +<body> + <p>Test for .cur cursor intrinsic hot spot behavior. See <a href="https://bugs.webkit.org/show_bug.cgi?id=15779">bug 15779</a>.</p> + <div style="background:turquoise;cursor:url(resources/cur-hotspot.cur), auto; width:200px; height:200px; position:absolute; top:100px; left: 50px;">Mouse cursor should be upside down inside this box.</div> + + <div style="background:turquoise;cursor:url(resources/cur-hotspot.cur) 200 200, auto; width:200px; height:200px; position:absolute; top:100px; left: 300px;">Mouse cursor should be upside down inside this box.</div> + + <div style="background:turquoise;cursor:url(resources/cur-hotspot.cur) 0 0, auto; width:200px; height:200px; position:absolute; top:350px; left: 50px;">Mouse cursor should flip erratically, due to incorrect hot spot forced in CSS.</div> + +</body> +</html> 
diff --git a/ManualTests/cursor-empty-url.html b/ManualTests/cursor-empty-url.html new file mode 100644 index 0000000..a336100 --- /dev/null +++ b/ManualTests/cursor-empty-url.html 
@@ -0,0 +1,3 @@ +<div>Mousing over the grey block should not cause a crash.</div> +<link rel="stylesheet" href="resources/cursor-empty-url.css"></link> +<div id="target" style="width: 50px; height: 50px; margin: 10px; background: #ddd"></div> 
diff --git a/ManualTests/cursor-max-size.html b/ManualTests/cursor-max-size.html new file mode 100644 index 0000000..66ee152 --- /dev/null +++ b/ManualTests/cursor-max-size.html 
@@ -0,0 +1,25 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN"> +<html> +<head> +<style> +html, body +{ + height: 100%; width: 100%; overflow: hidden; position: relative; + cursor: url("resources/apple.jpg"), /* bigger than 128px x 128px */ + url("resources/helpCursor.tiff") -10 10, /* negative x in hotspot */ + url("resources/helpCursor.tiff") 10 -10, /* negative y in hotspot */ + url("resources/helpCursor.tiff") -10 -10, /* negative x and y in hotspot */ + url("resources/helpCursor.tiff") 20 10, /* x hotspot outside image (image is 16px x 16px) */ + url("resources/helpCursor.tiff") 10 20, /* y hotspot outside image (image is 16px x 16px) */ + url("resources/helpCursor.tiff") 20 20, /* both x and y hotspot outside image (image is 16px x 16px) */ + auto; +} +</style> +</head> +<body> + <p> + If there is a custom cursor, the test has failed. This tests that images larger than 128x128 cannot be used + as cursors and that hotspots cannot be outside of the cursors bounds box. + </p> +</body> +</html> 
diff --git a/ManualTests/cursor.html b/ManualTests/cursor.html new file mode 100644 index 0000000..206cfe0 --- /dev/null +++ b/ManualTests/cursor.html 
@@ -0,0 +1,38 @@ +<div>Mouse over the grey blocks to change the cursor.</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: auto">auto</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: default">default</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: hand">hand</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: pointer">pointer</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: text">text</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: help">help</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: crosshair">crosshair</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: move">move</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: w-resize">w</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: e-resize">e</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: n-resize">n</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: s-resize">s</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: nw-resize">nw</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: ne-resize">ne</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: sw-resize">sw</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: se-resize">se</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: ns-resize">ns</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: ew-resize">ew</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: nwse-resize">nwse</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: nesw-resize">nesw</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: col-resize">col</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: row-resize">row</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: all-scroll">allscroll</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: vertical-text">verticaltext</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: context-menu">contextmenu</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: no-drop">nodrop</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: not-allowed">notallowed</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: progress">progress</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: wait">wait</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: alias">alias</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: cell">cell</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: copy">copy</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: none">none</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: -webkit-zoom-in">zoom in</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: -webkit-zoom-out">zoom out</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: -webkit-grab">grab</div> +<div style="width: 20px; height: 20px; margin: 10px; background: #ddd; cursor: -webkit-grabbing">grabbing</div> 
diff --git a/ManualTests/cursorfallback.xml b/ManualTests/cursorfallback.xml new file mode 100644 index 0000000..a4fdf2f --- /dev/null +++ b/ManualTests/cursorfallback.xml 
@@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Strict mode + SVG cursor fallback test</title> +</head> +<body> +<p>Test svg cursor fallback, should show help cursor:</p> +<svg xmlns="http://www.w3.org/2000/svg"  + xmlns:xlink="http://www.w3.org/1999/xlink" width="500" height="300"> +<defs> + <cursor id="help" xlink:href="resources/helpcursor.tiff" x="10" y="11"/> +</defs> +<g cursor="url(nonexistent.png), url(custom-cursors.html), url(unknown-scheme:custom-cursors.html), url(#nonexistant), url(#help), text"> + <rect x="0" y="0" width="50" height="50" fill="blue" /> +</g> +<text y="62">Test svg cursor fallback with hotspot, should show help cursor:</text> +<g cursor="url(#help) 1 1, text"> + <rect x="0" y="70" width="50" height="50" fill="red" /> +</g> +<text y="132">Test svg cursor fallback with illegal hotspot, should show default cursor:</text> +<g cursor="url(#help) 1, text"> + <rect x="0" y="140" width="50" height="50" fill="red" /> +</g> +<text y="202">Test svg cursor fallback with illegal hotspot, should show default cursor:</text> +<g cursor="url(#help) 1 2 3, text"> + <rect x="0" y="210" width="50" height="50" fill="red" /> +</g> +</svg> +<p>Testing cursor fallback in strict mode, should show help cursor:</p> +<div style='width:100px;height:100px;background-color:lightblue; cursor:url(nonexistent.png), url("resources/helpcursor.tiff"), text;'></div> +</body> +</html> 
diff --git a/ManualTests/custom-cursors.html b/ManualTests/custom-cursors.html new file mode 100644 index 0000000..0620c47 --- /dev/null +++ b/ManualTests/custom-cursors.html 
@@ -0,0 +1,10 @@ +<a href="http://bugs.webkit.org/show_bug.cgi?id=8991">Bug 8991</a>: REGRESSION: missing or broken CSS custom cursors are displayed as a missing image icon.<p> +Move the cursor over the blue box - it should not turn into a missing image icon, and should turn into an I-beam over text. + +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png), auto;"><span style="cursor:url(nonexistent.png), auto;">some text</span></div> +<div style="width:100px;height:50px;background-color:lightblue; cursor:url(nonexistent.png);"></div> + +<hr> +<a href="http://bugs.webkit.org/show_bug.cgi?id=8991">Bug 6001</a>: WebKit does not handle fallback custom cursors<p> +Move the cursor over the blue box - it should become a help cursor (question mark). +<div style="width:100px;height:100px;background-color:lightblue; cursor:url(resources/helpCursor.tiff), help;"></div> 
diff --git a/ManualTests/custom-scrollbar-renderer-removed-crash.html b/ManualTests/custom-scrollbar-renderer-removed-crash.html new file mode 100644 index 0000000..54f33f4 --- /dev/null +++ b/ManualTests/custom-scrollbar-renderer-removed-crash.html 
@@ -0,0 +1,11 @@ +<html> +<body> +Reload page and mouse click quickly in the black box. +<style> +::-webkit-scrollbar { width: 1000; } +</style> +<script>setTimeout("try { document.body.offsetTop; child = document.body; child.parentNode.removeChild(child); } catch(e) {}", 100);</script> +<svg> +</svg> +</body> +</html> 
diff --git a/ManualTests/data-transfer-items-file-dragout.html b/ManualTests/data-transfer-items-file-dragout.html new file mode 100644 index 0000000..5e36fcf --- /dev/null +++ b/ManualTests/data-transfer-items-file-dragout.html 
@@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html> +<body> +<p><b>BUG ID: 76367</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=76367">Bugzilla bug </a> Add DataTransferItems support for drag-and-drop'ed files and texts</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1. Open the <a href="resources">$(WebKitRoot)/ManualTests/resources</a> folder in your native file browser.<br> +2. Drag and drop a file into the 'Drop files here' area below.<br> +3. Drag out <a href="#" id="dragout" draggable="true">this link</a> out of the browser window into a different folder in the native file browser). +</p> + +<div id="destination" style="min-height:100px; margin: 5px; border: solid 1px black">Drop files here </div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b> +The same file you dropped in the step 2 should be dragged out to the folder in the step 3. The file should have the same content and the same file name as the dropped file. (NOTE: this does not work for multiple files yet.) +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b> +Nothing happens or a different file from the dropped one (likely a text file with the page title) is dragged out. +</p> +<p id="console"></p> + +<script> +function log(text) +{ + var console = document.getElementById('console'); + console.appendChild(document.createTextNode(text)); + console.appendChild(document.createElement('br')); +} + +function test(expect, actual) +{ + log((expect == actual ? 'PASS' : 'FAIL') + ': "' + expect + '" == "' + actual + '"'); +} + +var destination = document.getElementById('destination'); +destination.addEventListener('dragover', handleDragOver, false); +destination.addEventListener('drop', handleDrop, false); + +function handleDragOver(e) +{ + e.stopPropagation(); + e.preventDefault(); +} + +function handleDrop(e) +{ + e.stopPropagation(); + e.preventDefault(); + + log('Verifying contents of DataTransferItems...'); + var items = e.dataTransfer.items; + var files = []; + test(1, items.length); + + for (var i = 0; i < items.length; ++i) { + test('file', items[i].kind); + var file = items[i].getAsFile(); + log('Dragged files: ' + file.name); + log('Dragged file size: ' + file.size); + files.push(file); + } + + // Setting up dragout items. + log('Setting up dragging out with the dropped items...'); + var source = document.getElementById('dragout'); + source.addEventListener('dragstart', function(e) { + for (var i = 0; i < files.length; ++i) { + log('Dragging out ' + files[i].name); + e.dataTransfer.items.add(files[i]); + } + }, false); + + log('Please dragout the link (noted in the step 3) and see if the same file you dropped in in the step 2 is properly drag out.'); +} + +</script> +</body> +</html> 
diff --git a/ManualTests/database-callback-deferred.html b/ManualTests/database-callback-deferred.html new file mode 100644 index 0000000..cf3d03a --- /dev/null +++ b/ManualTests/database-callback-deferred.html 
@@ -0,0 +1,17 @@ +<html> +<script> +function test() { + function transactionCallback() + { + document.getElementById("result").innerHTML = "Callback was called. Test passed"; + } + var db = openDatabase("DatabaseCallbackDeferred", "1.0", "", 1); + db.transaction(function(tx) { tx.executeSql("CREATE TABLE IF NOT EXISTS CallbackDeferredTest (randomData)", []); }, transactionCallback, transactionCallback); + + alert("Wait for a few seconds and close it"); +} +</script> +<body onload="test()"> +<p id="result">Wait...</p> +</body> +</html> 
diff --git a/ManualTests/database-threading-stress-test-2.html b/ManualTests/database-threading-stress-test-2.html new file mode 100644 index 0000000..b99af3c --- /dev/null +++ b/ManualTests/database-threading-stress-test-2.html 
@@ -0,0 +1,51 @@ +<!doctype html> +<html> +<head> +<script> +var db; + +try { + if (window.openDatabase) { + db = openDatabase("StressTest2", "1.0", "Database stress test", 200000); + if (!db) + alert("Failed to open the database on disk. This is probably because the version was bad or there is not enough space left in this domain's quota"); + } else + alert("Couldn't open the database. Please try with a WebKit nightly with this feature enabled"); +} catch(err) { } + +function loaded() +{ + db.transaction(function(tx) { + tx.executeSql("SELECT COUNT(*) FROM WebkitStickyNotes", [], function(result) { + loadNotes(); + }, function(tx, error) { + tx.executeSql("CREATE TABLE WebKitStickyNotes (id REAL UNIQUE, note TEXT)", [], function(result) {  + tx.executeSql("INSERT INTO WebKitStickyNotes (id, note) VALUES (?, ?)", [1, 'Text'], function(result) {  + tx.executeSql("INSERT INTO WebKitStickyNotes (id, note) VALUES (?, ?)", [2, 'More Text'], function(result) {  + loadNotes();  + }); + }); + }); + }); + }); +} + +function loadNotes() +{ + db.transaction(function(tx) { + tx.executeSql("SELECT id, note FROM WebKitStickyNotes", [], function(tx, result) { + loadNotes(); + }, function(tx, error) { + alert('Failed to retrieve notes from database - ' + error.message); + return; + }); + }); +} + +addEventListener('load', loaded, false); +</script> +</head> +<body> +<p>This test needs to run without crashes and assertion failures for a while.<p> +</body> +</html> 
diff --git a/ManualTests/database-threading-stress-test.html b/ManualTests/database-threading-stress-test.html new file mode 100644 index 0000000..f22610c --- /dev/null +++ b/ManualTests/database-threading-stress-test.html 
@@ -0,0 +1,84 @@ +<!doctype html> +<html> +<head> + +<style> +pre { padding: 5px; border: 1px solid black; } +</style> + +<script> +var db; + +try { + if (window.openDatabase) { + db = openDatabase("StressTest1", "1.0", "Database Stress Test", 200000); + if (!db) + alert("Failed to open the database on disk. This is probably because the version was bad or there is not enough space left in this domain's quota"); + } else + alert("Couldn't open the database."); +} catch(err) { } + +var highestId = 0; +var allData = new Array(); + +function newData() +{ + var id = ++highestId; + allData.push(id); + db.transaction(function (tx)  + { + tx.executeSql("INSERT INTO FillerData (id, filler) VALUES (?, randomblob(1024))", [id]); + });  +} + +function testOpen() +{ + for (var i = 0; i < 4; i++) { + newData(); + } + + setTimeout("testClose();", 0); +} + +function testClose() +{  + db.transaction(function(tx) + {  + for (var i = 0; i < allData.length; i++) + tx.executeSql("DELETE FROM FillerData WHERE id = ?", [allData[i]]); + + allData = new Array(); + }); + setTimeout("testOpen();", 0); +} + +function updateTransactionCount() +{ + document.getElementById("transactionCount").innerHTML = "Current Transaction Count: " + highestId; + setTimeout("updateTransactionCount();", 1000); +} + +function loaded() +{ + db.transaction(function(tx) { + tx.executeSql("SELECT COUNT(*) FROM FillerData", [], function(result) { }, function(tx, error) { + tx.executeSql("CREATE TABLE FillerData (id REAL UNIQUE, filler)", [], function(result) {  + }); + }); + }); + + setTimeout("testOpen();", 0); + setTimeout("updateTransactionCount();", 1000); +} + +addEventListener('load', loaded, false); +</script> +</head> + +<body> +This test stresses the database threading code by constantly opening transactions to the test database at a fast rate.<br> +See radar 5729446 for more details.<br> +<pre id="transactionCount">Current Transaction Count: 0</pre> + +</body> +</html> 
diff --git a/ManualTests/debugger-caught-uncaught-exceptions.html b/ManualTests/debugger-caught-uncaught-exceptions.html new file mode 100644 index 0000000..d812ca6 --- /dev/null +++ b/ManualTests/debugger-caught-uncaught-exceptions.html 
@@ -0,0 +1,35 @@ +<html> + <head> + <script> + function generateUncaughtException() { + var b = 5; + // Pause on uncaught exceptions and pause on all exceptions should pause here, + // because even though the exception is being caught by our caller in this case, + // it is not being caught in the same function. + b.foo.bar; + } +  + function generateCaughtAndUncaughtExceptions() { + var a = 5; + try { + // This will pause on Pause on all exceptions, but not Pause on uncaught exceptions. + a.foo.bar; + } catch (e) { } +  + try { + generateUncaughtException(); + } catch (e) { } +  + // This will pause on both Pause on all exceptions and Pause on uncaught exceptions. + a.foo.bar; + } + </script> + </head> + <body> + <p>This page tests <a href="https://bugs.webkit.org/show_bug.cgi?id=28622">Caught exceptions still pause the debugger</a> + <p>To test this bug, open the inspector, open the scripts panel, and click the button to pause on all exceptions, press + the button, and see which exceptions are paused on. Then press the pause on exceptions button again to only + pause on uncaught exceptions, and see which exceptions are paused on.</p> + <input type="button" value="Generate caught and uncaught exceptions" onclick="generateCaughtAndUncaughtExceptions();" /> + </body> +</html> 
diff --git a/ManualTests/deleteToEndOfLine.html b/ManualTests/deleteToEndOfLine.html new file mode 100644 index 0000000..fdbc24d --- /dev/null +++ b/ManualTests/deleteToEndOfLine.html 
@@ -0,0 +1,20 @@ +<html>  +<head> + +<style> +.editing {  + border: 1px solid red;  + padding: 12px;  + font-size: 24px;  +} +</style> + +<title>deleteToEndOfLine: test</title>  +</head>  +<body> +<p>First add the following line to your ~/Library/KeyBindings/DefaultKeyBinding.dict then relaunch Safari: "^k" = "deleteToEndOfLine:";</p> +<p>Place the cursor between the two 'o's in 'Foo' and hit ^k twice. The first should result in 'Fo\nbar' and the second should result in 'Fobar'.</p> +<div class="editing" contentEditable><div>Foo</div><div>bar</div></div> + +</body> +</html> 
diff --git a/ManualTests/dictionary-scrolled-iframe.html b/ManualTests/dictionary-scrolled-iframe.html new file mode 100644 index 0000000..d7cf23e --- /dev/null +++ b/ManualTests/dictionary-scrolled-iframe.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8295">Bugzilla bug 8295</a> Dictionary pop-up panel targets the wrong word in a scrolled IFRAME</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b><br> +1. Click the inner frame&rsquo;s down scroll arrow once.<br> +2. Move the mouse pointer +over &ldquo;target&rdquo;.<br> +3. Press Command-Control-D to invoke the Dictionary pop-up panel. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The Dictionary pop-up panel will appear over &ldquo;target&rdquo;, giving its definition. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The Dictionary pop-up panel will appear over &ldquo;failure&rdquo;, with the definition of failure. +</p> + +<iframe style="background: #ffd;" src="data:text/html,Curabitur pretium, quam quis semper malesuada, est libero feugiat libero, vel fringilla orci nibh sed neque. Quisque eu nulla non nisi molestie accumsan. Etiam tellus urna, <span style=%22color: green;%22>target</span> ac, laoreet non, suscipit sed, sapien. Phasellus vehicula, sem at posuere tel failure, augue nibh molestie nisl, nec ullamcorper lacus ante vulputate pede. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris viverra augue vitae purus. Morbi sed sem. Donec dui nisi, ultrices non, pretium quis, hendrerit non, est. Donec tellus. Donec eget dui id eros pharetra rutrum. Suspendisse sodales lectus sit amet nulla. Morbi tortor arcu, convallis blandit, elementum eu, aliquet a, tellus. +"></iframe> + +</body> +</html> 
diff --git a/ManualTests/directory-drop-on-view.html b/ManualTests/directory-drop-on-view.html new file mode 100644 index 0000000..b82cc45 --- /dev/null +++ b/ManualTests/directory-drop-on-view.html 
@@ -0,0 +1,20 @@ +<html>  + <head> + <title>  + Manual drop test + </title>  + </head> + <body>  + This tests that unknown file types are handled correctly when dropped in the window + <ul>  + <li> + Drag a file that WebKit doesn't recognise -- eg. a disk image, tarball, etc.<br /> + WebKit should cause a Finder window to open, with the dropped file selected.  + </li> + <li>  + Attempt to drop a directory onto the WebView.<br /> + The drag should not be accepted, and the drag cursor should be the standard disallowed drag cursor.  + </li> + </ul> + </body> +</html> \ No newline at end of file 
diff --git a/ManualTests/disable-javascript-reload.html b/ManualTests/disable-javascript-reload.html new file mode 100644 index 0000000..c7e2a91 --- /dev/null +++ b/ManualTests/disable-javascript-reload.html 
@@ -0,0 +1,21 @@ +<html> +<head> +<script> +function test() +{ + document.getElementById("manualDirections").setAttribute("style","display:block;"); + document.getElementById("console").innerHTML = "FAIL - disabled javascript hasn't been applied to refreshed webpage"; +} + +</script> +</head> +<body onload="test();"> +<div id="manualDirections" style="display:none;"> +To run this test manually, disable javascript and reload the page. +<br><br> +</div> +<div id="console"> +PASS +</div> +</body +</html> 
diff --git a/ManualTests/disabled-option-elements.html b/ManualTests/disabled-option-elements.html new file mode 100644 index 0000000..4ff291f --- /dev/null +++ b/ManualTests/disabled-option-elements.html 
@@ -0,0 +1,26 @@ +<body> +<p>This tests that disabled option elements shouldn't be selectable and that no elements in disabled optgroups are selectable.</p> +<form name="form"> +<select multiple="multiple"> +<option>my value 1</option> +<option value="2" disabled>you should not be able to select this</option> +<option>my value 3</option> +<optgroup label="disabled option group" disabled> +	<option>this should be disabled</option> +	<option>as well as this</option> +<optgroup> +</select> + +<select> +<option>my value 1</option> +<option value="2" disabled>you should not be able to select this</option> +<option>my value 3</option> +<optgroup label="disabled option group" disabled> +	<option>this should be disabled</option> +	<option>as well as this</option> +<optgroup> +</select> +</form> + +</body> +</html> 
diff --git a/ManualTests/display-none-option.html b/ManualTests/display-none-option.html new file mode 100644 index 0000000..30071f3 --- /dev/null +++ b/ManualTests/display-none-option.html 
@@ -0,0 +1,11 @@ +<p> +When you click the following &lt;select&gt;, you should see only two options. +Mac Safari doesn't pass this test yet. +See <a href="https://bugs.webkit.org/show_bug.cgi?id=8351">Bug 8351</a> for detail. + +<p> +<select> + <option>First choice</option> + <option style="display: none">You must NOT see this</option> + <option>Second choice</option> +</select> 
diff --git a/ManualTests/divx-plugin-fails-to-draw.html b/ManualTests/divx-plugin-fails-to-draw.html new file mode 100644 index 0000000..0b3b8c4 --- /dev/null +++ b/ManualTests/divx-plugin-fails-to-draw.html 
@@ -0,0 +1,12 @@ +<html> +<body> +This is a manual test for +<a href="https://bugs.webkit.org/show_bug.cgi?id=39457">Bug #39457</a>. It +requires that you have the DivX plugin installed.<br><br> + +The plugin below should not appear as a white box but as a video player with +controls.<br><br> + +<embed type="video/divx" width=320 height=240> +</body> +</html> 
diff --git a/ManualTests/dom-manipulation-on-resize.html b/ManualTests/dom-manipulation-on-resize.html new file mode 100644 index 0000000..81eaa5a --- /dev/null +++ b/ManualTests/dom-manipulation-on-resize.html 
@@ -0,0 +1,28 @@ +<html> +<head><style> +body { overflow: hidden; } +</style> +<script> +window.onresize = function() { + var tbody = document.createElement("TBODY") + + var m = (document.getElementsByTagName("TABLE"))[0] + if(m.hasChildNodes()) m.removeChild(m.lastChild) + + var tr = tbody.appendChild(document.createElement("TR")) + + m.appendChild(tbody) +} +</script> +</head> +<body onload="setTimeout('window.resizeTo(500,500)', 0)"> +<table></table> +<p> +<b>BUG ID: <a href="http://bugs.webkit.org/show_bug.cgi?id=8739">Bugzilla bug 8739</a></b> +Crash in RenderTableSection::paint due to manipulating DOM on resize +</p> +<p id="success" style="background-color:palegreen; padding:3px;"> +><b>TEST PASS:</b> You got here without crashing, which means test PASS. It is normal for the +window to have resized. +</p> +</body></html> 
diff --git a/ManualTests/dom/document-write-synchronous-after-page-load.html b/ManualTests/dom/document-write-synchronous-after-page-load.html new file mode 100644 index 0000000..f62fd68 --- /dev/null +++ b/ManualTests/dom/document-write-synchronous-after-page-load.html 
@@ -0,0 +1,23 @@ +<p>This test ensures that document.write after page load is synchronous.</p> +<p>You will get a PASS or FAIL alert message after a few seconds.</p> +<script> +window.onload = function() { + + // Build a very long string to write. + var LIMIT = 17; + var str = '<p style="display:none">x</p>'; + for (var i=0; i<LIMIT; ++i) + str += str; + + // Write the string and check the DOM immediately and after a small delay. + var doc = document.implementation.createHTMLDocument(); + doc.write(str); + var immediateElementCount = doc.getElementsByTagName('*').length; + setTimeout(function() { + var delayedElementCount = doc.getElementsByTagName('*').length; + var passOrFail = (immediateElementCount === delayedElementCount ? "PASS" : "FAIL"); + alert(passOrFail); + }, 100); + +} +</script> 
diff --git a/ManualTests/dom/form-control-for-label.html b/ManualTests/dom/form-control-for-label.html new file mode 100644 index 0000000..aeb8338 --- /dev/null +++ b/ManualTests/dom/form-control-for-label.html 
@@ -0,0 +1,12 @@ +<html> +<style> +progress {border: 3px solid blue;} +progress:hover {border: 3px solid red;} +</style> +<body> +<h3>Test hover</h3> +<label>The border color of the progress bar should change from blue to red when you hover on this label text <progress></progress></label><br> +<label>The border of this progress bar would change color when it is inside fieldset and legend elements <fieldset><legend><progress></progress></legend></fieldset></label><br> +</body> +</html> + 
diff --git a/ManualTests/dom/progressbar.html b/ManualTests/dom/progressbar.html new file mode 100644 index 0000000..99c888d --- /dev/null +++ b/ManualTests/dom/progressbar.html 
@@ -0,0 +1,15 @@ +<h1>Progress bars</h1> +<h2>Large</h2> +<div style="font-size:16px"> +This is an example of <progress value=7 max=10></progress> a determinate progress bar.<br> +This is an example of <progress></progress> an indeterminate progress bar.<br> +This is an example of <progress dir=rtl value=7 max=10></progress> a right-to-left determinate progress bar.<br> +This is an example of <progress dir=rtl></progress> a right-to-left indeterminate progress bar.<br> +</div> +<h2>Small</h2> +<div style="font-size:14px"> +This is an example of <progress value=4 max=10></progress> a small determinate progress bar.<br> +This is an example of <progress></progress> a small indeterminate progress bar.<br> +This is an example of <progress dir=rtl value=4 max=10></progress> a small right-to-left determinate progress bar.<br> +This is an example of <progress dir=rtl></progress> a small right-to-left indeterminate progress bar.<br> +</div> 
diff --git a/ManualTests/drag-background-with-padding.html b/ManualTests/drag-background-with-padding.html new file mode 100644 index 0000000..fd2e1f6 --- /dev/null +++ b/ManualTests/drag-background-with-padding.html 
@@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<html> + <body style="background-color: silver;"> + <p>For a draggable element that has padding, the drag image that is created + should respect that background color. Note that none of the drag images + use any of the body element's silver background.</p> + + <div style="position: absolute; top: 100px; padding: 50px; border: solid 2px black;" draggable="true"> + <div style="background-color: grey; width: 100px; height: 100px;">Drag me! Drag image padding should remain transparent.</div> + </div> + + <div style="position: absolute; top: 350px; padding: 50px; border: solid 2px black; background-color: rgba(1, 0, 0, 0);" draggable="true"> + <div style="background-color: grey; width: 100px; height: 100px;">Drag me! Drag image padding should be transparent.</div> + </div> + + <div style="position: absolute; top: 350px; left: 250px; padding: 50px; border: solid 2px black; background-color: white;" draggable="true"> + <div style="background-color: grey; width: 100px; height: 100px;">Drag me! Drag image padding should be white.</div> + </div> + + <div style="position: absolute; top: 350px; left: 500px; padding: 50px; border: solid 2px black; background-color: lime;" draggable="true"> + <div style="background-color: grey; width: 100px; height: 100px;">Drag me! Drag image padding should be lime.</div> + </div> + + <div style="position: absolute; top: 100px; left: 250px; width: 200px; height: 200px; background-color: cyan;"> Drag on top of me just for reference.</div> + + </body> +</html> 
diff --git a/ManualTests/drag-caret.html b/ManualTests/drag-caret.html new file mode 100644 index 0000000..4334ab2 --- /dev/null +++ b/ManualTests/drag-caret.html 
@@ -0,0 +1,3 @@ +<p>This tests dragging over an input element, to make sure no drag-cursor is left behind.</p> +<p><input></p> +<p>Drag some text over the input element and make sure the Drag Caret disappears when the drag exits the input element. Per https://bugs.webkit.org/show_bug.cgi?id=26787</p> 
diff --git a/ManualTests/drag-color-to-contenteditable.html b/ManualTests/drag-color-to-contenteditable.html new file mode 100644 index 0000000..d0c74b3 --- /dev/null +++ b/ManualTests/drag-color-to-contenteditable.html 
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> +<body> +<p><b>BUG ID:</b> <a href="https://bugs.webkit.org/show_bug.cgi?id=74775">74775</a> WebKit editing throws exception when monochrome color dragged onto text</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ol> +<li>Open a color panel in any app, such as TextEdit.app.</li> +<li>Select some text in the editable region below.</li> +<li>Drag a color swatch for a monochrome color, e.g. a gray from the grayscale slider of the color panel, to the selected text.</li> +</ol> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +If the color changes to the desired gray, and the drag appears to be accepted, the test passes. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If the color change does not apply to the text, and the drag appears to bounce back, then the bug is probably occurring. The bug can be confirmed by looking for evidence of an uncaught exception in the system console log. +</p> + +<div contentEditable="true">Select this text and drag a grayscale color to it.</div> + +</body> +</html> 
diff --git a/ManualTests/drag-cursor-notallowed.html b/ManualTests/drag-cursor-notallowed.html new file mode 100644 index 0000000..e6cb6d4 --- /dev/null +++ b/ManualTests/drag-cursor-notallowed.html 
@@ -0,0 +1,111 @@ +<html> +<head> +<style> +#dropTarget, #dragMe { text-align: center; display: table-cell; vertical-align: middle } +#dropTarget {width: 256px; height: 256px; border: 1px dashed} +#dragMe {-webkit-user-drag: element; -webkit-user-select: none; background: #ff0000; width: 64px; height: 64px; color: white} +.pass { font-weight: bold; color: green; } +.fail { font-weight: bold; color: red; } +</style> +<script> + var dragMe; + var dropTarget; + var messageElm; + var defaultMessageElm; + var event; +  + var ALLOWED_EFFECTS = 'move'; + var DROP_EFFECT = 'copy'; +  + window.onload = function() + { + dragMe = document.getElementById("dragMe"); + dropTarget = document.getElementById("dropTarget"); + messageElm = document.getElementById("message"); + defaultMessageElm = document.getElementById("default-message"); +  + if (!dragMe || !dropTarget || !messageElm || !defaultMessageElm) + return; +  + dragMe.ondragstart = dragStart; + dragMe.ondragend = dragEnd; +  + dropTarget.ondragenter = dragEntered; + dropTarget.ondragover = dragOver; + dropTarget.ondrop = drop; + } +  + function dragStart(e) + { + event = e; + e.dataTransfer.effectAllowed = ALLOWED_EFFECTS; + e.dataTransfer.setData('Text', e.target.textContent); + } +  + function dragEnd(e) + { + messageElm.style.visibility = "hidden"; + defaultMessageElm.style.visibility = "visible"; + return; + } +  + function dragEntered(e) + { + messageElm.style.visibility = "visible"; + defaultMessageElm.style.visibility = "hidden"; + dragEnteredAndUpdated(e); + } +  + function dragOver(e) + { + dragEnteredAndUpdated(e); + } +  + function dragEnteredAndUpdated(e) + { + event = e; + e.dataTransfer.dropEffect = DROP_EFFECT; + cancelDrag(e); + } +  + function drop(e) + { + cancelDrag(e); + } +  + function cancelDrag(e) + { + if (e.preventDefault) + e.preventDefault(); + else { + // Assume this script is executing within Internet Explorer + e.returnValue = false; + } + } +</script> +</head> +<body> + <p id="description">This test can be used to verify that the not-allowed cursor is shown during an invalid drag-and-drop operation.  + In particular, if the effectAllowed is <code><script>document.write(ALLOWED_EFFECTS)</script></code> and the dropEffect of the  + drop target is <code><script>document.write(DROP_EFFECT)</script></code> then the drop is not allowed and the cursor should + change to the not-allowed cursor. Note, this test only pertains to the Windows build since the Mac build does not show a drop cursor + for a not-allowed drop operation (see bug #25925). + <br/><br/> + Drag the red square over the drop target (demarcated by the dashed boundary). While hovering over the drop target, if the cursor  + is <img alt="not-allowed" src="data:image/gif;base64,R0lGODlhEgASAIAAAAAAAP///yH5BAAAAAAALAAAAAASABIAAAIvjA+px6ifmnmM1ijDmlbuuHmAhoWXaTqYKq7sObZw3HwgXd8cPr8yDGxBXEJioAAAOw=="> then the test <span class="pass">PASSED</span>. Otherwise, the test <span class="fail">FAILED</span>.</p> + <div id="test-container"> + <label for="effectAllowed">effectAllowed:</label> <code><script>document.write(ALLOWED_EFFECTS)</script></code> + <br/><br/> + <div id="dropTarget"> + <div id="default-message">Drag the red square over me.<br/><br/> + <label for="dropEffect">Expects dropEffect:</label> <code><script>document.write(DROP_EFFECT)</script></code> + </div> + <div id="message" style="visibility:hidden">The cursor should be <img alt="not-allowed" src="data:image/gif;base64,R0lGODlhEgASAIAAAAAAAP///yH5BAAAAAAALAAAAAASABIAAAIvjA+px6ifmnmM1ijDmlbuuHmAhoWXaTqYKq7sObZw3HwgXd8cPr8yDGxBXEJioAAAOw==">. Is it?</div> + </div> + <hr/> + <p>Items that can be dragged to the drop target:</p> + <div id="dragMe" draggable="true">Square</div> + <hr/> + </div> +</body> +</html> 
diff --git a/ManualTests/drag-enter-alert.html b/ManualTests/drag-enter-alert.html new file mode 100644 index 0000000..e563923 --- /dev/null +++ b/ManualTests/drag-enter-alert.html 
@@ -0,0 +1,29 @@ +<html>  +<head>  +<script type="text/javascript">  +function test() { + if (window.layoutTestController) + layoutTestController.dumpAsText(); + + var element = document.documentElement; + var showAlert = function() { + alert('Click OK button.'); + }; +  + if (element.addEventListener) + element.addEventListener('dragenter', showAlert, false); + else + element.attachEvent('ondragenter', showAlert); +} +</script>  +  +</head> +<body onload="test()"> + <p>Do the following and see if Webkit crashes.</p> + <ul> + <li>Drag the image</li>  + <li>Click the OK button on the alert box</li>  + </ul> + <img id="dragimage" src="resources/drag-image.png" width="32px" height="32px">  +</body> +</html>  
diff --git a/ManualTests/drag-escape.html b/ManualTests/drag-escape.html new file mode 100644 index 0000000..ebdf4e7 --- /dev/null +++ b/ManualTests/drag-escape.html 
@@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> +<head> +<script> + +var expectedEvents = ["dragstart", "dragend"]; +var i = 0; + +function recordEvent(e) { + log(e.type); + if (e.type !== expectedEvents[i]) { + log("FAIL - expected " + expectedEvents[i] + " but got " + e.type); + } else if (i == expectedEvents.length - 1) { + log("SUCCESS"); + } else { + i++; + } +} + + +function log(msg) { + var tn = document.createTextNode(msg + "\n"); + document.getElementById("log").appendChild(tn); +} + +function dragStart(e) { + recordEvent(e); +} + +document.ondragend = function(e) { + recordEvent(e); +}; + +document.ondrop = function(e) { + log("FAIL - we should not get a " + e.type); +}; + +document.ondragenter = document.ondragover = function(e) { + e.preventDefault(); +}; + + +</script> +</head> +<body> + <p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=26699">https://bugs.webkit.org/show_bug.cgi?id=26699</a></p> + + <p>Instructions: </p> + + <p>Drag the "Drag Me!" link below</p> + <p>Press escape</p> + + <a id="test-link" href="http://webkit.org" ondragstart="dragStart(event)">Drag Me!</a> + + <pre id="log"></pre> +</body> +</html> 
diff --git a/ManualTests/drag-image-for-links-and-images.html b/ManualTests/drag-image-for-links-and-images.html new file mode 100644 index 0000000..17c0fa0 --- /dev/null +++ b/ManualTests/drag-image-for-links-and-images.html 
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <script> + function onDragStart(event) { + var dragImage = document.getElementById('dragImage'); + event.dataTransfer.setDragImage( + dragImage, dragImage.offsetWidth / 2, dragImage.offsetHeight / 2); + } + </script> + </head> + <body> + <p><img id="dragImage" src="resources/webkit-background.png"> + <p>Try dragging the image or the link below. The drag image should be + identical to the image above, centered on the cursor. + <p><a href="#" ondragstart="onDragStart(event)">Drag Me</a> + <p><img src="resources/3dolph.gif" ondragstart="onDragStart(event)"> + </body> +</html> 
diff --git a/ManualTests/drag-image-no-crash.html b/ManualTests/drag-image-no-crash.html new file mode 100644 index 0000000..dad8c07 --- /dev/null +++ b/ManualTests/drag-image-no-crash.html 
@@ -0,0 +1,87 @@ +<html> +<body> +<script> +// This is a 10x10 24-bits RGB BMP image in white. +var imageString = +"Qk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAATCwAAEwsAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + +"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; + +// Raw image byets. +var imageRaw = window.atob(imageString).split(""); + +// 10x10x3 bytes are image data. +var pixelBytes = 300; +var beginByte = imageRaw.length - pixelBytes; + +function generateNewImage() +{ + // Add 1 to image data. + for (var i = beginByte; i < imageRaw.length; ++i) { + var c = imageRaw[i].charCodeAt(0); + if (c == 255) { + imageRaw[i] = String.fromCharCode(0); + } else { + imageRaw[i] = String.fromCharCode(c+1); + break; + } + } + + var bmpImage = new Image(); + bmpImage.src = "data:image/bmp;base64," + window.btoa(imageRaw.join("")); + return bmpImage; +} + +var imageCount = 0; +function addImage() +{ + if (imageCount >= 1000 * 1000) + return; + document.getElementById("imageCanvas").appendChild(generateNewImage()); + window.setTimeout("addImage()", 1); +} + +function runTest() +{ + document.getElementById("dragFrame").contentWindow.location.href = + "about:blank"; + addImage(); +} +</script> +<p>To run this test:</p> +<p>1. Drag this text 10 times: + <iframe id="dragFrame" width="50" height="30">.</iframe></p> +<p>2. Click this <button onclick="runTest();">Start</button> button.</p> +<p>3. Let it run for 5 minutes and browser shouldn't crash.</p> +<div id="imageCanvas"></div> + +<script> +// Write this content to the iframe. +var content = + "<" + "body" + ">" + + "<" + "script" + ">" + + "function dragStartHandler()" + + "{" + + " var img = new Image();" + + " img.src = 'data:image/bmp;base64," + imageString + "';" + + " event.dataTransfer.setDragImage(img, 10, 10);" + + "}" + + "</" + "script" + ">" + + "<span ondragstart='dragStartHandler()'" + + " style='-webkit-user-select:none;" + + " -webkit-user-drag: element;" + + " position: absolute; top: 0; left: 0;" + + " background-color: blue;'>HERE</span>" + + "</" + "body" + ">"; + +var doc = document.getElementById("dragFrame"); +doc.contentDocument.open(); +doc.contentDocument.write(content); +doc.contentDocument.close(); +</script> +</body> +</html> 
diff --git a/ManualTests/drag-image-table-part-decorations.html b/ManualTests/drag-image-table-part-decorations.html new file mode 100644 index 0000000..28aa175 --- /dev/null +++ b/ManualTests/drag-image-table-part-decorations.html 
@@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<p> + When dragging each of the black squares below, the drag image should include + only the hollow black square, and no blue background. +</p> +<div style="background-color: blue; display: table; height: 100px; width: 100px;"></div> +<div style="width: 94px; height: 94px; border: solid; -webkit-user-drag: element; margin-top: -50px; margin-bottom: 10px;"></div> + +<div style="background-color: blue; display: table-row; height: 100px;"><div style="width: 100px"></div></div> +<div style="width: 94px; height: 94px; border: solid; -webkit-user-drag: element; margin-top: -50px; margin-bottom: 10px;"></div> + +<div style="background-color: blue; display: table-cell; height: 100px; width: 100px;"></div> +<div style="width: 94px; height: 94px; border: solid; -webkit-user-drag: element; margin-top: -50px; margin-bottom: 10px;"></div> + +<fieldset style="background-color: blue; border: none; height: 100px; width: 100px;"><legend></legend></fieldset> +<div style="width: 94px; height: 94px; border: solid; -webkit-user-drag: element; margin-top: -50px; "></div> + +<table style="border-collapse: collapse;"><tr><td style="border-bottom: 100px solid blue; width: 100px;"></td></tr></table> +<div style="width: 94px; height: 94px; border: solid; -webkit-user-drag: element; margin-top: -50px; "></div> 
diff --git a/ManualTests/drag-image-to-address-bar.html b/ManualTests/drag-image-to-address-bar.html new file mode 100644 index 0000000..8a8c088 --- /dev/null +++ b/ManualTests/drag-image-to-address-bar.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=9952">Bugzilla bug 9952</a> REGRESSION: Repro crash when dragging an image from the window to the address bar</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Drag the image from below to the address bar, then click on the image. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +No crash. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Safari will crash when you drop the image onto the address bar or when you click it. +</p> + +<img src="resources/webkit-background.png"><br><iframe></iframe> + +</body> +</html> 
diff --git a/ManualTests/drag-image.html b/ManualTests/drag-image.html new file mode 100644 index 0000000..328ca98 --- /dev/null +++ b/ManualTests/drag-image.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<html> +<head> +<script> +function debug(str) { + var c = document.getElementById('console') + c.appendChild(document.createTextNode(str + '\n')); +} + +var i = new Image() +i.src ="resources/webkit-background.png"; + +function dragStartHandler() {  + event.dataTransfer.setDragImage(i, 10, 10); +} + +</script> +</head> +<body onload="runTests();"> +<p>This tests that setting the drag image works. If this is successful, the drag icon when dragging the text below around should look like the image below.</p> +<img src="resources/webkit-background.png"> +<div ondragstart="dragStartHandler()" draggable="true">Try dragging me around!</div> +<pre id="console"> +</pre> +</body> +</html> 
diff --git a/ManualTests/drag-move-in-search-field.html b/ManualTests/drag-move-in-search-field.html new file mode 100644 index 0000000..4bb720a --- /dev/null +++ b/ManualTests/drag-move-in-search-field.html 
@@ -0,0 +1,11 @@ +<p>Double-click the word "dolor" to select it, then drag the selection to +between "lorem" and "ipsum". There should be no assertion failure in a +debug build.</p> + +<input id="foo" type="search" value="lorem ipsum dolor"> +<script> +function test() +{ + +} +</script> 
diff --git a/ManualTests/drag-out-of-background-window.html b/ManualTests/drag-out-of-background-window.html new file mode 100644 index 0000000..05fa087 --- /dev/null +++ b/ManualTests/drag-out-of-background-window.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=15077">Bugzilla bug 15077</a> REGRESSION: Cannot drag selected text out of a background window</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1. Select the first line of text in this window.<br> +2. Switch to another application.<br> +3. With this window in the background, click and hold inside the selected text, +then drag the text out of the window. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +This window will not come to the foreground when you click, and you will be able to +drag the selected text out. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +As soon as you click in the selected text, this window will come to the foreground +and you may not be able to drag the selected text. +</p> +</body> +</html> 
diff --git a/ManualTests/drag-should-draw-target.html b/ManualTests/drag-should-draw-target.html new file mode 100644 index 0000000..6498d63 --- /dev/null +++ b/ManualTests/drag-should-draw-target.html 
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <head> + <style> + .container { + margin: 10px; + width: 300px; + height: 200px; + background-color: grey; + } + + .static { + display: static; + } + + .inline-block { + display: inline-block; + } + + .floatleft { + float: left; + } + + *[draggable=true] { + width: 100px; + height: 100px; + margin: 10px; + background-color: green; + } + </style> + </head> + <body> + <div class="container inline-block static"> + display: inline-block; position: static; + <div draggable="true">Drag Me</div> + If the drag-icon follows the mouse pointer while dragging the above green block, the test passes. + </div> + + <div class="container" style="overflow:hidden"> + greybox overflow:hidden; greenbox float:left;<br> + <div class="floatleft" draggable="true">Drag Me</div> + If the drag-icon follows the mouse pointer while dragging the green block to the left, the test passes. + </div> + + </body> +</html> 
diff --git a/ManualTests/drag-with-div-or-image-as-data-image.html b/ManualTests/drag-with-div-or-image-as-data-image.html new file mode 100644 index 0000000..203fa84 --- /dev/null +++ b/ManualTests/drag-with-div-or-image-as-data-image.html 
@@ -0,0 +1,55 @@ +<html> + <head> + <title>Test for WebKit bug 24735: Poor setDragImage support on Windows</title> + <style type="text/css"> + + .draggable { + -webkit-user-drag: element; + -webkit-user-select: none; + } +  + #linkToUseAsImage { + background-color: silver; + } +  + #divToUseAsImage { + background-color: pink; + } + + </style> + + <script type="text/javascript"> + function dragDivAndSeeImageDragged() + { + event.dataTransfer.setDragImage(document.getElementById("imgToUseAsImage"), event.pageX, event.pageY); + } +  + function dragImageAndSeeDivDragged() + { + event.dataTransfer.setDragImage(document.getElementById("divToUseAsImage"), event.pageX, event.pageY); + } + </script> + </head> + <body > + <h3>Test for <a href='https://bugs.webkit.org/show_bug.cgi?id=24735'>WebKit bug 24735</a>: Poor setDragImage support on Windows</h3> + + <p>Instructions: </p> + <p>When you drag the first div, the image under the cursor should be of the second image. </p> + <p>When you drag the first image, the image under the cursor should be of the second div. </p> +  + <br /> + <br /> +  + <div class="draggable" ondragstart="dragDivAndSeeImageDragged()"> Drag me, I am a div! (first div)</div> + <br /> + <br /> + <img src="resources/webkit-background.png" class="draggable" ondragstart="dragImageAndSeeDivDragged()" /> + <br /> + <br /> + <img src="resources/drag-image.png" id="imgToUseAsImage" /> + <br /> + <br /> + <div id="divToUseAsImage"> When a drag is started on the image, this is the div that is used as the drag image! (second div)</div> +  + </body> +</html> 
diff --git a/ManualTests/drag_select_highlighting.html b/ManualTests/drag_select_highlighting.html new file mode 100644 index 0000000..d6f4057 --- /dev/null +++ b/ManualTests/drag_select_highlighting.html 
@@ -0,0 +1,14 @@ +<html> +<head> +<title>Highlight leaves trails</title> +</head> +<body> +<p>Drag across the following line from right to left and all the way back.</p> +<p style="font-family:'Lucida Grande'; font-size:12px;"> +Curabitur pretium, quam quis semper malesuada, est libero feugiat libero, vel fringilla orci nibh sed neque. +</p> +<p>Drag across the following line from left to right and all the way back.</p> +<p style="font-family:'Lucida Grande'; font-size:12px; text-align:left; direction:rtl; unicode-bidi:bidi-override;"> +Curabitur pretium, quam quis semper malesuada, est libero feugiat libero, vel fringilla orci nibh sed neque. +</p> +</body> \ No newline at end of file 
diff --git a/ManualTests/drag_with_opacity.html b/ManualTests/drag_with_opacity.html new file mode 100644 index 0000000..0e4b69b --- /dev/null +++ b/ManualTests/drag_with_opacity.html 
@@ -0,0 +1,33 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>Untitled Document</title> +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> +<style type="text/css"> +<!-- +.draggable { +	-khtml-user-drag: element; +	-apple-dashboard-region:dashboard-region(control rectangle); +} + +.draggable:hover { +	background: #cccccc; +} + +.draggable:-khtml-drag {  +	opacity: 0.50; +} +--> +</style> +</head> +<body> + <p>This is the test case for crashing bug &lt;rdar://problem/4234658&gt;<p> + <table width="100%" border="1" cellspacing="0" cellpadding="0"> + <tr> + <td> + <div class="draggable">Click to right of this text and drag</div> + </td> + </tr> + </table> +</body> +</html> 
diff --git a/ManualTests/draw-focus-if-needed-dirty-rect.html b/ManualTests/draw-focus-if-needed-dirty-rect.html new file mode 100644 index 0000000..e5d8b6f --- /dev/null +++ b/ManualTests/draw-focus-if-needed-dirty-rect.html 
@@ -0,0 +1,55 @@ +<!DOCTYPE html> +<html> +<head> + <title>drawSystemFocusRing() dirty rect test</title> + <script src="../../resources/js-test.js"></script> +</head> +<body> + <p>This test is passed if result1 is exactly the same with result2.</p> + <p> + <button id="result1">Result1</button> + <button id="result2">Result2</button> + </p> + <canvas id="canvas" class="output" width="300" height="300"> + <button id="button"></button> + </canvas> +<script> + + var canvas = document.getElementById("canvas"); + var context = canvas.getContext("2d"); + var button = document.getElementById("button"); + var result1 = document.getElementById("result1"); + var result2 = document.getElementById("result2"); + + function drawResult(separateFrame) { + + button.focus(); + + requestAnimationFrame(function() { + context.beginPath(); + context.rect(0, 0, 300, 300); + context.fill(); + + context.beginPath(); + context.rect(50, 50, 200, 100); + + if (separateFrame) + requestAnimationFrame(function() { + context.drawSystemFocusRing(button); + }); + else + context.drawSystemFocusRing(button); + }); + } + + result1.addEventListener("click", function() { + drawResult(false); + }, false); + + result2.addEventListener("click", function() { + drawResult(true); + }, false); + +</script> +</body> +</html> 
diff --git a/ManualTests/drop-in-empty-doc.html b/ManualTests/drop-in-empty-doc.html new file mode 100644 index 0000000..eae14f8 --- /dev/null +++ b/ManualTests/drop-in-empty-doc.html 
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<html> +<body> +<p>Click <a href="javascript:window.open('resources/drop-in-empty-doc.xhtml')">here</a> to open a new window. Drag and drop a file over the new window. It should not crash. +</body> +</html> 
diff --git a/ManualTests/drop-text-acquires-style.html b/ManualTests/drop-text-acquires-style.html new file mode 100644 index 0000000..602c760 --- /dev/null +++ b/ManualTests/drop-text-acquires-style.html 
@@ -0,0 +1,11 @@ +<html>  +<head> +<title>Dragging plain text into a styled region</title>  +</head>  +<body> +<p>This test ensures the plain text dropped into a styled text region will acquire the appropriate style</p> +<p>To run this test, drag the text in the input element below into the bold text region. The dropped text should be bold.</p> +<input id="dragme" value="Drag this text" ><br /> +<b contenteditable="true" id="target">Drag the text from the above input element into this bold text</b> +</body> +</html> 
diff --git a/ManualTests/editing-disabled-node-replace-crash.html b/ManualTests/editing-disabled-node-replace-crash.html new file mode 100644 index 0000000..970ccb6 --- /dev/null +++ b/ManualTests/editing-disabled-node-replace-crash.html 
@@ -0,0 +1,13 @@ +<!DOCTYPE html> + +<html> +<head> + <title>Replacing text should not crash.</title> +</head> +<body> + <p>Manual test for fix <a href="https://bugs.webkit.org/show_bug.cgi?id=75941">Bug 75941</a></p> + <p>Right click the following input text, and replace the misspelled text [zz] to something.</p> + <p>Renderer should not crash in that operation.</p> + <input id="input" disabled value="zz"> +</body> +</html> 
diff --git a/ManualTests/empty-link-target.html b/ManualTests/empty-link-target.html new file mode 100644 index 0000000..06ccd0c --- /dev/null +++ b/ManualTests/empty-link-target.html 
@@ -0,0 +1,28 @@ +<html> +<head><script> +function print(message) { + var paragraph = document.createElement("p"); + paragraph.appendChild(document.createTextNode(message)); + document.getElementById("console").appendChild(paragraph); +} + +function test() +{ + if (window.layoutTestController) + layoutTestController.dumpAsText(); +  + var e = document.createEvent("MouseEvents"); + e.initEvent("click", true, false); + document.getElementById('a').dispatchEvent(e); + print("PASS"); +} +</script></head> + +<body onload="test()"> +<p>Bug: <a href="http://bugs.webkit.org/show_bug.cgi?id=6382">REGRESSION: Repro crash when clicking link with target="_blank"</a></p> +<p>If the test passes, you will see a PASS message below. (It's normal for a new window to open.)</p> +<hr> +<a id="a" href="resources/popup200x200.html" target="_blank"></a> +<div id='console'/> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/empty-script-crash.html b/ManualTests/empty-script-crash.html new file mode 100644 index 0000000..eabddd5 --- /dev/null +++ b/ManualTests/empty-script-crash.html 
@@ -0,0 +1,6 @@ +This document used to crash when loaded as the very first document in +a Safari instance to use JavaScript. It can't be a meaningful layout +test since it would get loaded after many other documents that ran +scripts. +<script>  +</script> 
diff --git a/ManualTests/empty-title-popup.html b/ManualTests/empty-title-popup.html new file mode 100644 index 0000000..cb6ea8c --- /dev/null +++ b/ManualTests/empty-title-popup.html 
@@ -0,0 +1,3 @@ +<p>This demonstrates <a href="http://bugs.webkit.org/show_bug.cgi?id=9833">bug 9833</a>.</p> +<p>Select the second item on the pop up. +<select><option></option><option>Pick me!</option></select></p> 
diff --git a/ManualTests/error-event-during-context-initialization-crash.html b/ManualTests/error-event-during-context-initialization-crash.html new file mode 100644 index 0000000..271dfab --- /dev/null +++ b/ManualTests/error-event-during-context-initialization-crash.html 
@@ -0,0 +1,9 @@ +<script> +function main() +{ + document.body.insertAdjacentHTML("beforeBegin", "<iframe></iframe>"); +} + +document.addEventListener("DOMNodeInserted", main); +setTimeout(main, 0); +</script> 
diff --git a/ManualTests/eventsource/eventsource-loader-buffering.html b/ManualTests/eventsource/eventsource-loader-buffering.html new file mode 100644 index 0000000..896b790 --- /dev/null +++ b/ManualTests/eventsource/eventsource-loader-buffering.html 
@@ -0,0 +1,54 @@ +<!doctype html> +<html> +<head> +<title>EventSource Loader Buffering</title> +<script> +window.onload = function () { + setTimeout(test_es, 500); +}; + +function test_es() { + var len = 0; + var count = 0; + var step = 1000; + var es = new EventSource("eventsource-loader-buffering.php"); + es.onopen = function () { + log("got 'open' event"); + log("waiting for the first " + step + " 'message' events"); + }; + es.onmessage = function (evt) { + len += evt.data.length; + if (++count % step) + return; + log("got " + count + " 'message' events (" + len + " characters)", 1); + if (len >= 1e9) + end(); + }; + es.onerror = function () { + log("got 'error' event"); + end(); + }; + function end() { + if (es.readyState != es.CLOSED) + es.close(); + log("ENDED"); + }; +} + +function log(message, updateLast) { + if (!log.list) + log.list = document.getElementById("log"); + var text = document.createTextNode(message); + if (updateLast) + log.list.lastChild.replaceChild(text, log.list.lastChild.firstChild); + else + log.list.appendChild(document.createElement("li")).appendChild(text); +} +</script> +</head> +<body> +<p>Manual test to verify that the EventSource loader does not buffer data (may result in memory growth with long lived connections). Monitor memory usage; it should be stable. This file has to be served from the same web server as the php script with the same name.</p> +<ul id="log" style="list-style-type: none"></ul> +</body> +</html> + 
diff --git a/ManualTests/eventsource/eventsource-loader-buffering.php b/ManualTests/eventsource/eventsource-loader-buffering.php new file mode 100644 index 0000000..fe2c86f --- /dev/null +++ b/ManualTests/eventsource/eventsource-loader-buffering.php 
@@ -0,0 +1,13 @@ +<?php +header("Content-Type: text/event-stream"); + +$data = ""; +for ($i = 0; $i < 1000; $i++) + $data .= "x"; + +for ($i = 0; $i < 30000; $i++) { + echo "data: $data\n\n"; + flush(); + usleep(1000); +} +?> 
diff --git a/ManualTests/filters/opacity-above-filter.html b/ManualTests/filters/opacity-above-filter.html new file mode 100644 index 0000000..ecac0bc --- /dev/null +++ b/ManualTests/filters/opacity-above-filter.html 
@@ -0,0 +1,27 @@ +<!DOCTYPE html> + +<html> +<head> + <style> +  + .container { + opacity: 0.8; + margin: 10px; + } +  + .filtered { + width: 100px; + height: 100px; + background-color: blue; + -webkit-filter: blur(10px); + } + </style> +</head> +<body> + <a href="https://bugs.webkit.org/show_bug.cgi?id=76329">https://bugs.webkit.org/show_bug.cgi?id=76329</a> + <p>Open this test in Safari, and hit Command-F to Find. A debug build should not assert.</p> + <div class="container"> + <div class="filtered box"></div> + </div> +</body> +</html> 
diff --git a/ManualTests/find-and-highlight-in-svg.html b/ManualTests/find-and-highlight-in-svg.html new file mode 100644 index 0000000..2e686f2 --- /dev/null +++ b/ManualTests/find-and-highlight-in-svg.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE HTML> +<html> +<body> + Manual test for crbug.com/56580: Search (ctrl+f) for "findme" and verify the appropriate text is highlighted.<br/> + This test passes if all 15 instances of "findme" are found.<br/><br/> + + Lorum ipsum findme lorum ipsum findmefindme lorum.<br/> + longtextfindmenoyou.<br/> + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="450" height="300"> + <defs> + <path id="textpath" + d="M 100 200 + C 200 100 300 0 400 100 + C 500 200 600 300 700 200 + C 800 100 900 100 900 100" /> + </defs> + <text x="10" y="50">Can you findme in this boring text? findme...Findme...FINDME!</text> + <text x="10" y="100" style="font-size: 10px; font-family: monospace;">Findme in a typewriter! Findmefindme.</text> + <g transform="scale(0.3) translate(0 400)"> + <text font-family="Verdana" font-size="42.5" fill="blue" > + <textPath xlink:href="#textpath"> + Findme on a path! Did you findme? + </textPath> + </text> + </g> + </svg> +</body> +</html> + 
diff --git a/ManualTests/find-count-matches-after-text-control.html b/ManualTests/find-count-matches-after-text-control.html new file mode 100644 index 0000000..738be8c --- /dev/null +++ b/ManualTests/find-count-matches-after-text-control.html 
@@ -0,0 +1,14 @@ +<p> + Test that text matches are counted correctly when a match occurs inside a text field. +</p> +<p> + To test: + <ol> + <li>Choose Edit > Find > Find</li> + <li>In the Find field, type &ldquo;lemon&rdquo; + </ol> +</p> +<p> + The test passes if the Find banner says &ldquo;3 matches&rdquo;. +</p> +<input value="a lemon in a text field"> and another lemon. 
diff --git a/ManualTests/first-line-style-crash.html b/ManualTests/first-line-style-crash.html new file mode 100644 index 0000000..4758b1e --- /dev/null +++ b/ManualTests/first-line-style-crash.html 
@@ -0,0 +1,23 @@ +<html> +<head> +<link rel="stylesheet" type="text/css" href="resources/aFileThatProbablyDoesNotExist.css"> +<style type="text/css"> + div:first-line { color: green; } +</style> +</head> +<body> + <p> + Regression test for <i><a href="http://bugs.webkit.org/show_bug.cgi?id=8760">http://bugs.webkit.org/show_bug.cgi?id=8760</a> + crash (hang?) on subtlegradient.com article page</i>. + </p> + <p> + No crash means test PASS. + </p> + <hr> + <div> + <span id="t">Lorem ipsum</span> + </div> + <script type="text/javascript"> + document.getElementById("t").offsetTop; + </script> +</body> 
diff --git a/ManualTests/fixed-position-no-z-index.html b/ManualTests/fixed-position-no-z-index.html new file mode 100644 index 0000000..4c0b715 --- /dev/null +++ b/ManualTests/fixed-position-no-z-index.html 
@@ -0,0 +1,25 @@ +<html> +<head> +<style> +.back { z-index: -1; position: absolute; width:1000px; height:1000px;} +.d1 { position:fixed; top:0; left:0; width:1000px; height:1000px;} +.d2 { margin: 30px 40% 20px 20%; position: relative; z-index: 5;} +body { margin: 0px; } +</style> +</head> +<body> +<div class="d1"><img class="back" src="resources/simple_image.png"> +</div> +<div class="d2"> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.<br> + +</div> +</body></html> 
diff --git a/ManualTests/fixed-position.html b/ManualTests/fixed-position.html new file mode 100644 index 0000000..a4d3e22 --- /dev/null +++ b/ManualTests/fixed-position.html 
@@ -0,0 +1,92 @@ +<html><head> + +<meta content="text/html; charset=windows-1251" http-equiv="Content-Type"> +<style> +.d1{position:fixed;top:50%;right:50%;z-index:2;overflow:hidden;} +.d2{position:fixed;bottom:5em;left:50;z-index:2;overflow:hidden;} +.o {background:green;height:40px;width:200px;} +.t { width:2000px; height:198px;background-color: lightgray; border: 1px solid blue;} +body { margin: 0px; } +</style> +<script> +function remove_fixed() +{ + document.getElementById("d1").style.position = "static"; +} + +function change_fixed() +{ + document.getElementById("d2").style.bottom = "10em"; +} + +</script> +</head> +<body class="Gradient"> +<div class="d1" id="d1"><div class="o">This is a test</div></div> +<div class="d2" id="d2"><div class="o">This is a test</div></div> +<div class="t" onclick="remove_fixed();"> +000 +</div> +<div class="t"> +200<br> +<button onclick="remove_fixed();">remove fixed</button> +</div> +<div class="t"> +400<br> +<button onclick="change_fixed();">change fixed</button> +</div> +<div class="t"> +600 +</div> +<div class="t"> +800 +</div> +<div class="t"> +1000 +</div> +<div class="t"> +1200 +</div> +<div class="t"> +1400 +</div> +<div class="t"> +1600 +</div> +<div class="t"> +1800 +</div> +<div class="t"> +2000 +</div> +<div class="t"> +2200 +</div> +<div class="t"> +2400 +</div> +<div class="t"> +2600 +</div> +<div class="t"> +2800 +</div> +<div class="t"> +3000 +</div> +<div class="t"> +3200 +</div> +<div class="t"> +3400 +</div> +<div class="t"> +3600 +</div> +<div class="t"> +3800 +</div> +<div class="t"> +4000 +</div> +</body></html> 
diff --git a/ManualTests/flash-unload-tab.html b/ManualTests/flash-unload-tab.html new file mode 100644 index 0000000..0ba1cf1 --- /dev/null +++ b/ManualTests/flash-unload-tab.html 
@@ -0,0 +1,39 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body onload="start()" onunload="test()"> + <p> + <p><b>Bug 14207 : </b> + <a href="http://bugs.webkit.org/show_bug.cgi?id=14207">REGRESSION: Crash after closing a tab with Google Maps Street View</a></p> +  + <p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  + Open a new tab then close this tab. + </p> +  + <p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  + Expected : The tab is closed. + </p> +  + <p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  + If the test FAILS : The webkit crashes. + </p> + </p> + <embed id="target" src="resources/spinbox.swf"> + <script> + var embed; + + function start() + { + embed = document.getElementById("target"); + embed.bar; + } + + function test() + { + embed.foo; + } + </script> +</body> +</html> 
diff --git a/ManualTests/flipped-text-rendering.html b/ManualTests/flipped-text-rendering.html new file mode 100644 index 0000000..197e4b3 --- /dev/null +++ b/ManualTests/flipped-text-rendering.html 
@@ -0,0 +1,14 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN"> +<html> +<head> +<title>Flipped text in link drag image</title> +</head> +<body> +<p>Try dragging each of the following links. In each case, the link text should appear correctly (not flipped) in the +drag image, above the URL.</p> +<p>There are three separate code paths, due to the canUseFastRenderer and shouldUseATSU functions.</p> +<p>WebKit renderer, using CG: <a href="/">Drag me to your leader</a></p> +<p>WebKit renderer, using ATSUI because of the &#x905;: <a href="/">Drag me &#x0905; to your leader</a></p> +<p>Cocoa, because of the &#x05d0;: <a href="/">Drag me &#x05d0; to your leader</a></p> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/focus-change-between-key-events.html b/ManualTests/focus-change-between-key-events.html new file mode 100644 index 0000000..8ceb575 --- /dev/null +++ b/ManualTests/focus-change-between-key-events.html 
@@ -0,0 +1,24 @@ +<body onload="document.getElementById('dummy').focus();"> +<iframe src="data:text/html,<body onload='document.getElementsByTagName(&quot;input&quot;)[0].focus()'><input></body>" id=victim name=victim> +</iframe> +<script> + +var cur_pos = 0; + +function maybe_redirect(e) { + var evt = window.event ? event : e; + var cc = evt.charCode ? evt.charCode : evt.keyCode; + + document.getElementById('victim').focus(); + frames['victim'].focus(); + + document.getElementById('dummy').value += String.fromCharCode(cc).toLowerCase(); + + setTimeout('focus();document.getElementById("dummy").focus()',1); +} + + +</script> +<p>Type some text. It should only appear in the below input field.</p> +<input type=text onkeydown="maybe_redirect(event)" id=dummy> +</body> 
diff --git a/ManualTests/focus-select-when-clicked.html b/ManualTests/focus-select-when-clicked.html new file mode 100644 index 0000000..3f1e798 --- /dev/null +++ b/ManualTests/focus-select-when-clicked.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4011544">4011544</a> selecting an item from a select menu with the mouse doesn't place the focus on the menu</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1. Click on the pop-up menu below titled "Click Here", and select OPTION 1 from the list. <br> +2. Verify that a blue focus ring is drawn around the pop-up menu. <br>  +3. Press tab, and verify that focus moves to TEXT AREA 2 <br></p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Blue focus ring is drawn around the pop-up menu when clicked, then focus moves to TEXT AREA 2 after pressing tab.</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +No blue focus ring drawn around the pop-up menu when clicked, or after selecting OPTION 1 from the list. After selecting option 1 and pressing tab, focus will land on the first focusable element on the page. +</p> + +<input type="text" value="TEXT AREA 1"> +<select> +	<option>Click Here</option> +	<option>OPTION 1</option> +</select> +<input type="text" value="TEXT AREA 2"> + +</body> +</html> 
diff --git a/ManualTests/focusringcolor-change-on-theme-change.html b/ManualTests/focusringcolor-change-on-theme-change.html new file mode 100644 index 0000000..ca12fe6 --- /dev/null +++ b/ManualTests/focusringcolor-change-on-theme-change.html 
@@ -0,0 +1,8 @@ +<input value="Click on me! Focus ring color around this input element should change." style="width:100%"> +<ul> +<li>Select the input element above.</li> +<li>Change the system focus ring color.<br>On OS X you can do this by going to System Preferences-&gt;Appearance and selecting another value in the Appearance popup menu.</li>  +<li>Make Safari the active application again.</li> +</ul> + +<p>The tests passes if the focus ring around the input element changes color.</p> 
diff --git a/ManualTests/form-control-madness.html b/ManualTests/form-control-madness.html new file mode 100644 index 0000000..30dac2b --- /dev/null +++ b/ManualTests/form-control-madness.html 
@@ -0,0 +1,46 @@ +<input name="b" type="button" onclick="location='back.html'" value="Click Here"> + +<br> +Only the radio buttons between X's should be checked after clicking the button and going back +<form> +<input type="radio" name="old_version" value="12">  +<input type="radio" name="version" value="12"> + +X<input type="radio" name="old_version" value="11" checked="checked"> X +<input type="radio" name="version" value="11"> + +<input type="radio" name="old_version" value="10">  +X<input type="radio" name="version" value="10" checked="checked">X + +<input type="radio" name="old_version" value="9">  +<input type="radio" name="version" value="9"> + +<input type="radio" name="old_version" value="8">  +<input type="radio" name="version" value="8"> + +<input type="radio" name="old_version" value="7">  +<input type="radio" name="version" value="7"> + +<input type="radio" name="old_version" value="6">  +<input type="radio" name="version" value="6"> + +<input type="radio" name="old_version" value="5">  +<input type="radio" name="version" value="5"> + +<input type="radio" name="old_version" value="4">  +<input type="radio" name="version" value="4"> + +<input type="radio" name="old_version" value="3">  +<input type="radio" name="version" value="3"> + +<input type="radio" name="old_version" value="2">  +<input type="radio" name="version" value="2"> + +<input type="radio" name="old_version" value="1">  +<input type="radio" name="version" value="1"> + +<input type="radio" name="old_version" value="0">  +<input type="radio" name="version" value="0"> +</form> +<br> +<iframe></iframe> \ No newline at end of file 
diff --git a/ManualTests/form-element-spelling.html b/ManualTests/form-element-spelling.html new file mode 100644 index 0000000..805dddc --- /dev/null +++ b/ManualTests/form-element-spelling.html 
@@ -0,0 +1,6 @@ +<html> +<body> + <textarea>Helo everibody</textarea><input type="text" value="Helo everibody"> + <p>Test that it's possible to do spell-checking in the two elements above. Choose "Check Spelling" or "Spelling..." from the contextual menu and verify that both work.</p> +</body> +</html> 
diff --git a/ManualTests/form-value-restore.html b/ManualTests/form-value-restore.html new file mode 100644 index 0000000..7b065af --- /dev/null +++ b/ManualTests/form-value-restore.html 
@@ -0,0 +1,9 @@ +<p>This tests if form values get their values properly restored when you go back. +To test, use the Debug menu to turn off "Use Back/Forward Cache". +Then, type "a" into the first field below, type "b" into the second field, and select both "c" and "d" in the list box. +Then, click on <a href="about:blank">this link</a> to go to a blank page. +Then go back. +Check that the form elements have the values that selected.</p> +<div><input type="text" name="text-input"></div> +<div><textarea></textarea></div> +<div><select multiple size=5><option>a</option><option>b</option><option>c</option><option>d</option><option>e</option><option>f</option><option>g</option></select></div> 
diff --git a/ManualTests/forms/calendar-picker-crash-by-type-change.html b/ManualTests/forms/calendar-picker-crash-by-type-change.html new file mode 100644 index 0000000..7be901b --- /dev/null +++ b/ManualTests/forms/calendar-picker-crash-by-type-change.html 
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<script> +var input = document.createElement('input') +input.type = 'date' +var event = document.createEvent('KeyboardEvent') +event.initKeyboardEvent('keydown', false, false, null, 'Down') +input.dispatchEvent(event) +input.type = 'color' +</script> +<p>Success if the browser didn't crash.</p> 
diff --git a/ManualTests/forms/calendar-picker.html b/ManualTests/forms/calendar-picker.html new file mode 100644 index 0000000..99dbdd4 --- /dev/null +++ b/ManualTests/forms/calendar-picker.html 
@@ -0,0 +1,362 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<title>Calendar Picker test</title> +<style> +body { + background-color: #eeffff; + line-height: 1.4em; + font-family: Helvetica, sans-serif; +} +label { + width: 160px; + display: inline-block; +} +iframe { + z-index: 2147483647; + width: 100px; + height: 100px; + border: 0; + overflow: hidden; +} +</style> +</head> +<body> + +<p>This is a testbed for a calendar picker.</p> + +<h2>Preview</h2> + +<input type="text" id="date" style="margin: 0;"><br> +<iframe></iframe> + +<h2>Console</h2> + +<ol id="console" style="font-family:monospace;"></ol> + +<h2>Config</h2> +<form action="" method="GET"> + <fieldset> + <legend>Locale</legend> +  + <label for="locale">Locale</label> + <select name="locale" id="config_locale"> + <!-- Populated from locale_data. --> + </select> + <br /> + <label for="locale_rtl">Locale RTL</label> + <input type="checkbox" name="locale_rtl" id="config_locale_rtl" value="true"> + <br /> + <label for="week_start_day">Week start day</label> + <select name="week_start_day" id="config_week_start_day"> + <option value="0">Sunday</option> + <option value="1">Monday</option> + <option value="2">Tuesday</option> + <option value="3">Wednesday</option> + <option value="4">Thursday</option> + <option value="5">Friday</option> + <option value="6">Saturday</option> + </select> + </fieldset> + + <fieldset> + <legend>Attributes</legend> +  + <label for="type">[type]</label> + <select name="type" id="config_type"> + <option>date</option> + <option>week</option> + <option>month</option> + </select> + <br /> + <label for="value">[value]</label> + <input type="text" name="value" id="config_value"> + <br /> + <label for="min">[min]</label> + <input type="text" name="min" id="config_min"> + <br /> + <label for="max">[max]</label> + <input type="text" name="max" id="config_max"> + <br /> + <label for="step">[step]</label> + <input type="number" name="step" id="config_step"> + </fieldset> + <input type="submit" value="Submit"> +</form> + +<script> +function getParam(key) { + key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + var pattern = "[\\?&]" + key + "=([^&#]*)"; + var regex = new RegExp(pattern); + var results = regex.exec(window.location.search); + if (!results) + return ""; + return decodeURIComponent(results[1].replace(/\+/g, " ")); +} + +function setParam(key, value) { + key = escape(key); + value = escape(value); + + var kvp = document.location.search.substr(1).split('&'); + + for (var i = kvp.length - 1; i >= 0; --i){ + kvp[i] + var x = kvp[i].split('='); + if (x[0] === key) { + x[1] = value; + kvp[i] = x.join('='); + break; + } + } + + if (i < 0) + kvp[kvp.length] = key + "=" + value; + + document.location.search = kvp.join('&'); +} + +function $(id) { + return document.getElementById(id); +} + +var config = {}; +function initializeConfig() { + for (locale in locale_data) { + var option = document.createElement("option"); + option.setAttribute("label", locale_data[locale].displayName); + option.setAttribute("value", locale); + $("config_locale").appendChild(option); + } +  + config.locale = getParam("locale") || "en_US"; + config.isLocaleRTL = getParam("locale_rtl") === "true"; + config.weekStartDay = parseInt(getParam("weekStartDay") || "0", 10); + config.type = getParam("type") || "date"; + config.value = getParam("value") || ""; + config.min = getParam("min") || ""; + config.max = getParam("max") || ""; + config.step = getParam("step") || "1"; + + $("config_locale").value = config.locale; + $("config_locale_rtl").checked = config.isLocaleRTL; + $("config_week_start_day").value = config.weekStartDay; + $("config_type").value = config.type; + $("config_value").value = config.value; + $("config_min").value = config.min; + $("config_max").value = config.max; + $("config_step").value = config.step; +}; + +var locale_data = { + "en_US": { + "displayName": "English (United States)", + "shortMonthLabels": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ], + "dayLabels": [ + "S", + "M", + "T", + "W", + "T", + "F", + "S" + ], + }, + "ja": { + "displayName": "Japanese", + "shortMonthLabels": [ + "1月", + "2月", + "3月", + "4月", + "5月", + "6月", + "7月", + "8月", + "9月", + "10月", + "11月", + "12月" + ], + "dayLabels": [ + "日", + "月", + "火", + "水", + "木", + "金", + "土" + ], + }, + "ar": { + "displayName": "Arabic", + "shortMonthLabels": [ + "يناير", + "فبراير", + "مارس", + "أبريل", + "مايو", + "يونيو", + "يوليو", + "أغسطس", + "سبتمبر", + "أكتوبر", + "نوفمبر", + "ديسمبر" + ], + "dayLabels": [ + "ح", + "ن", + "ث", + "ر", + "خ", + "ج", + "س" + ], + }, + "vi": { + "displayName": "Vietnamese", + "shortMonthLabels": [ + "thg 1", + "thg 2", + "thg 3", + "thg 4", + "thg 5", + "thg 6", + "thg 7", + "thg 8", + "thg 9", + "thg 10", + "thg 11", + "thg 12" + ], + "dayLabels": [ + "CN", + "T2", + "T3", + "T4", + "T5", + "T6", + "T7" + ], + }, +}; + +function createParam() { + return { + mode: config.type, + locale: config.locale, + weekStartDay: config.weekStartDay, + isLocaleRTL: config.isLocaleRTL, + dayLabels: locale_data[config.locale].dayLabels, + shortMonthLabels: locale_data[config.locale].shortMonthLabels, + max: config.max, + min: config.min, + step: config.step * (config.type === "month" ? 1 : 86400000), + stepBase: "0", + currentValue: config.value, + axShowMonthSelector: "Show month selection panel", + axShowNextMonth: "Show next month", + axShowPreviousMonth: "Show previous month", + todayLabel: "Today", + } +}; + +function openCalendar() { + var frame = document.getElementsByTagName('iframe')[0]; + var doc = frame.contentDocument; + doc.documentElement.innerHTML = '<head></head><body><div id=main>Loading...</div></body>'; + var commonCssLink = doc.createElement('link'); + commonCssLink.rel = 'stylesheet'; + commonCssLink.href = '../../Source/web/resources/pickerCommon.css?' + (new Date()).getTime(); + doc.head.appendChild(commonCssLink); + var buttonCssLink = doc.createElement('link'); + buttonCssLink.rel = 'stylesheet'; + buttonCssLink.href = '../../Source/web/resources/pickerButton.css?' + (new Date()).getTime(); + doc.head.appendChild(buttonCssLink); + var suggestionPickerCssLink = doc.createElement('link'); + suggestionPickerCssLink.rel = 'stylesheet'; + suggestionPickerCssLink.href = '../../Source/web/resources/suggestionPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(suggestionPickerCssLink); + var link = doc.createElement('link'); + link.rel = 'stylesheet'; + link.href = '../../Source/web/resources/calendarPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(link); + var commonJsScript = doc.createElement('script'); + commonJsScript.src = '../../Source/web/resources/pickerCommon.js?' + (new Date()).getTime(); + doc.body.appendChild(commonJsScript); + var suggestionPickerJsScript = doc.createElement('script'); + suggestionPickerJsScript.src = '../../Source/web/resources/suggestionPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(suggestionPickerJsScript); + var script = doc.createElement('script'); + script.src = '../../Source/web/resources/calendarPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(script); + + var pagePopupController = { + setValueAndClosePopup: function(numValue, stringValue) { + window.log('number=' + numValue + ', string="' + stringValue + '"'); + if (numValue == 0) + window.document.getElementById('date').value = stringValue; + }, + setValue: function(stringValue) { + window.log('string="' + stringValue + '"'); + window.document.getElementById('date').value = stringValue; + }, + closePopup: function() { + window.log('closePopup'); + }, + localizeNumberString: function(numString) { + if (typeof numString == "number") + return numString.toLocaleString(); + return numString.toString(); + }, + histogramEnumeration: function() {}, + formatMonth: function(year, zeroBaseMonth) { + var monthLabels = ['<January>', '<February>', '<March>', '<April>', '<May>', '<June>', + '<July>', '<August>', '<September>', '<October>', '<November>', '<December>']; + return monthLabels[zeroBaseMonth] + " " + year; + }, + formatShortMonth: function(year, zeroBaseMonth) { + var monthLabels = ['<Jan>', '<Feb>', '<Mar>', '<Apr>', '<May>', '<Jun>', + '<Jul>', '<Aug>', '<Sept>', '<Oct>', '<Nov>', '<Dec>']; + return monthLabels[zeroBaseMonth] + " " + year; + }, + formatWeek: function(year, week, startDate) { + return '' + year + '-W' + week + ' starting on ' + startDate; + } + } + + setTimeout(function() { + frame.contentWindow.postMessage(JSON.stringify(createParam()), "*"); + frame.contentWindow.pagePopupController = pagePopupController; + }, 100); +} + +function log(str) { + var entry = document.createElement('li'); + entry.innerText = str; + document.getElementById('console').appendChild(entry); +} + +window.onload = function() { + initializeConfig(); + openCalendar(); +}; +</script> +</body> +</html> 
diff --git a/ManualTests/forms/color-suggestion-picker.html b/ManualTests/forms/color-suggestion-picker.html new file mode 100644 index 0000000..8715862 --- /dev/null +++ b/ManualTests/forms/color-suggestion-picker.html 
@@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<title>Color Suggestion Picker test</title> +<style> +body { + background-color: #eeffff; +} +iframe { + z-index: 2147483647; + width: 180px; + height: 240px; + border: 0; + overflow: hidden; +} +</style> +</head> +<body> + +<p>This is a testbed for a color suggestion picker.</p> + +<div><input type="color" id="color"></div> +<iframe></iframe> + +<ol id="console" style="font-family:monospace;"> +</ol> + +<script> +var arguments = { + values : ['#000000', '#404040', '#808080', '#c0c0c0', '#ffffff', '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff', '#404040', '#808080', '#c0c0c0', '#ffffff', '#980000', '#ff0000', '#ff9900', '#ffff00', '#00ff00', '#00ffff', '#4a86e8', '#0000ff', '#9900ff', '#ff00ff'], + otherColorLabel: 'Other...' +}; + +function openColorPicker(args) { + var frame = document.getElementsByTagName('iframe')[0]; + var doc = frame.contentDocument; + doc.documentElement.innerHTML = '<head></head><body><div id=main>Loading...</div></body>'; + var commonCssLink = doc.createElement('link'); + commonCssLink.rel = 'stylesheet'; + commonCssLink.href = '../../Source/web/resources/pickerCommon.css?' + (new Date()).getTime(); + doc.head.appendChild(commonCssLink); + var link = doc.createElement('link'); + link.rel = 'stylesheet'; + link.href = '../../Source/web/resources/colorSuggestionPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(link); + var commonJsScript = doc.createElement('script'); + commonJsScript.src = '../../Source/web/resources/pickerCommon.js?' + (new Date()).getTime(); + doc.body.appendChild(commonJsScript); + var script = doc.createElement('script'); + script.src = '../../Source/web/resources/colorSuggestionPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(script); + + var pagePopupController = { + setValueAndClosePopup: function(numValue, stringValue) { + window.log('number=' + numValue + ', string="' + stringValue + '"'); + if (numValue === 0) + window.document.getElementById('color').value = stringValue; + }, + setValue: function(value) { + window.log('value="' + value + '"'); + window.document.getElementById('color').value = value; + }, + closePopup: function() { + }, + } + + setTimeout(function() { + frame.contentWindow.postMessage(JSON.stringify(args), "*"); + frame.contentWindow.pagePopupController = pagePopupController; + }, 100); +} + +function log(str) { + var entry = document.createElement('li'); + entry.innerText = str; + document.getElementById('console').appendChild(entry); +} + +openColorPicker(arguments); +</script> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/forms/date-suggestion-picker.html b/ManualTests/forms/date-suggestion-picker.html new file mode 100644 index 0000000..9e9ec99 --- /dev/null +++ b/ManualTests/forms/date-suggestion-picker.html 
@@ -0,0 +1,275 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<title>Calendar Picker test</title> +<style> +body { + background-color: #eeffff; +} +iframe { + z-index: 2147483647; + width: 100px; + height: 100px; + border: 0; + overflow: hidden; +} +</style> +</head> +<body> + +<p>This is a testbed for date suggestion picker.</p> +<select onchange="selected(this)"> + <option>with datalist</option> + <option>with long datalist</option> + <option>Arabic with datalist</option> + <option>Arabic with long datalist</option> +</select> + +<div><input type="text" id="date"></div> +<iframe></iframe> + +<ol id="console" style="font-family:monospace;"> +</ol> + +<script> +var datalistArguments = { + locale: 'en-US', + dayLabels : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + todayLabel : 'Today', + clearLabel : 'Clear', + cancelLabel : 'Cancel', + weekStartDay : 0, + step : "86400000", + stepBase: "0", + max : '2099-12-31', + suggestionValues : ['2012-01-01', '2012-06-03', '2012-09-06', '2012-12-24'], + localizedSuggestionValues : ['1/1/12', '6/3/12', '9/6/12', '12/24/12'], + suggestionLabels : ['', 'Birthday', '', 'Christmas'], + showOtherDateEntry: true, + otherDateLabel: 'Other...', + inputWidth: 127, + suggestionHighlightColor: "#0000ff", + suggestionHighlightTextColor: "#ffffff" +}; +var longDatalistArguments = { + locale: 'en-US', + dayLabels : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + todayLabel : 'Today', + clearLabel : 'Clear', + cancelLabel : 'Cancel', + weekStartDay : 0, + step : "86400000", + stepBase: "0", + max : '2099-12-31', + suggestionValues: ["2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04", + "2012-01-05", "2012-01-06", "2012-01-07", "2012-01-08", "2012-01-09", + "2012-01-10", "2012-01-11", "2012-01-12", "2012-01-13", "2012-01-14", + "2012-01-15", "2012-01-16", "2012-01-17", "2012-01-18", "2012-01-19", + "2012-01-20", "2012-01-21", "2012-01-22", "2012-01-23", "2012-01-24", + "2012-01-25", "2012-01-26", "2012-01-27", "2012-01-28", "2012-01-29", + "2012-01-30", "2012-01-31", "2012-02-01", "2012-02-02", "2012-02-03", + "2012-02-04", "2012-02-05", "2012-02-06", "2012-02-07", "2012-02-08", + "2012-02-09", "2012-02-10", "2012-02-11", "2012-02-12", "2012-02-13", + "2012-02-14", "2012-02-15", "2012-02-16", "2012-02-17", "2012-02-18", + "2012-02-19", "2012-02-20", "2012-02-21", "2012-02-22", "2012-02-23", + "2012-02-24", "2012-02-25", "2012-02-26", "2012-02-27", "2012-02-28", + "2012-02-29", "2012-03-01", "2012-03-02", "2012-03-03", "2012-03-04", + "2012-03-05", "2012-03-06", "2012-03-07", "2012-03-08", "2012-03-09", + "2012-03-10", "2012-03-11", "2012-03-12", "2012-03-13", "2012-03-14", + "2012-03-15", "2012-03-16", "2012-03-17", "2012-03-18", "2012-03-19", + "2012-03-20", "2012-03-21", "2012-03-22", "2012-03-23", "2012-03-24", + "2012-03-25", "2012-03-26", "2012-03-27", "2012-03-28", "2012-03-29", + "2012-03-30", "2012-03-31"], + localizedSuggestionValues: ["1/1/12", "1/2/12", "1/3/12", "1/4/12", + "1/5/12", "1/6/12", "1/7/12", "1/8/12", "1/9/12", "1/10/12", "1/11/12", + "1/12/12", "1/13/12", "1/14/12", "1/15/12", "1/16/12", "1/17/12", + "1/18/12", "1/19/12", "1/20/12", "1/21/12", "1/22/12", "1/23/12", + "1/24/12", "1/25/12", "1/26/12", "1/27/12", "1/28/12", "1/29/12", + "1/30/12", "1/31/12", "2/1/12", "2/2/12", "2/3/12", "2/4/12", "2/5/12", + "2/6/12", "2/7/12", "2/8/12", "2/9/12", "2/10/12", "2/11/12", "2/12/12", + "2/13/12", "2/14/12", "2/15/12", "2/16/12", "2/17/12", "2/18/12", + "2/19/12", "2/20/12", "2/21/12", "2/22/12", "2/23/12", "2/24/12", + "2/25/12", "2/26/12", "2/27/12", "2/28/12", "2/29/12", "3/1/12", + "3/2/12", "3/3/12", "3/4/12", "3/5/12", "3/6/12", "3/7/12", "3/8/12", + "3/9/12", "3/10/12", "3/11/12", "3/12/12", "3/13/12", "3/14/12",  + "3/15/12", "3/16/12", "3/17/12", "3/18/12", "3/19/12", "3/20/12", + "3/21/12", "3/22/12", "3/23/12", "3/24/12", "3/25/12", "3/26/12", + "3/27/12", "3/28/12", "3/29/12", "3/30/12", "3/31/12"], + suggestionLabels: ["Today", "Tomorrow", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", ""], + showOtherDateEntry: true, + otherDateLabel: 'Other...', + inputWidth: 127, + suggestionHighlightColor: "#0000ff", + suggestionHighlightTextColor: "#ffffff" +}; + +var arabicDatalistArguments = { + locale: 'ar', + isRTL: true, + isCalendarRTL: true, + dayLabels : ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + todayLabel : 'اليوم', + clearLabel : 'مسح', + weekStartDay : 5, + step : "86400000", + stepBase: "0", + max : '2020-05-15', + suggestionValues : ['2012-01-01', '2012-06-03', '2012-09-06', '2012-12-24'], + localizedSuggestionValues : ['1/1/12', '6/3/12', '9/6/12', '12/24/12'], + suggestionLabels : ['', 'Birthday', '', 'Christmas'], + showOtherDateEntry: true, + otherDateLabel: 'Other...', + inputWidth: 127, + suggestionHighlightColor: "#0000ff", + suggestionHighlightTextColor: "#ffffff" +}; + +var arabicLongDatalistArguments = { + locale: 'ar', + isRTL: true, + isCalendarRTL: true, + dayLabels : ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + todayLabel : 'اليوم', + clearLabel : 'مسح', + weekStartDay : 5, + step : "86400000", + stepBase: "0", + max : '2020-05-15', + suggestionValues: ["2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04", + "2012-01-05", "2012-01-06", "2012-01-07", "2012-01-08", "2012-01-09", + "2012-01-10", "2012-01-11", "2012-01-12", "2012-01-13", "2012-01-14", + "2012-01-15", "2012-01-16", "2012-01-17", "2012-01-18", "2012-01-19", + "2012-01-20", "2012-01-21", "2012-01-22", "2012-01-23", "2012-01-24", + "2012-01-25", "2012-01-26", "2012-01-27", "2012-01-28", "2012-01-29", + "2012-01-30", "2012-01-31", "2012-02-01", "2012-02-02", "2012-02-03", + "2012-02-04", "2012-02-05", "2012-02-06", "2012-02-07", "2012-02-08", + "2012-02-09", "2012-02-10", "2012-02-11", "2012-02-12", "2012-02-13", + "2012-02-14", "2012-02-15", "2012-02-16", "2012-02-17", "2012-02-18", + "2012-02-19", "2012-02-20", "2012-02-21", "2012-02-22", "2012-02-23", + "2012-02-24", "2012-02-25", "2012-02-26", "2012-02-27", "2012-02-28", + "2012-02-29", "2012-03-01", "2012-03-02", "2012-03-03", "2012-03-04", + "2012-03-05", "2012-03-06", "2012-03-07", "2012-03-08", "2012-03-09", + "2012-03-10", "2012-03-11", "2012-03-12", "2012-03-13", "2012-03-14", + "2012-03-15", "2012-03-16", "2012-03-17", "2012-03-18", "2012-03-19", + "2012-03-20", "2012-03-21", "2012-03-22", "2012-03-23", "2012-03-24", + "2012-03-25", "2012-03-26", "2012-03-27", "2012-03-28", "2012-03-29", + "2012-03-30", "2012-03-31"], + localizedSuggestionValues: ["1/1/12", "1/2/12", "1/3/12", "1/4/12", + "1/5/12", "1/6/12", "1/7/12", "1/8/12", "1/9/12", "1/10/12", "1/11/12", + "1/12/12", "1/13/12", "1/14/12", "1/15/12", "1/16/12", "1/17/12", + "1/18/12", "1/19/12", "1/20/12", "1/21/12", "1/22/12", "1/23/12", + "1/24/12", "1/25/12", "1/26/12", "1/27/12", "1/28/12", "1/29/12", + "1/30/12", "1/31/12", "2/1/12", "2/2/12", "2/3/12", "2/4/12", "2/5/12", + "2/6/12", "2/7/12", "2/8/12", "2/9/12", "2/10/12", "2/11/12", "2/12/12", + "2/13/12", "2/14/12", "2/15/12", "2/16/12", "2/17/12", "2/18/12", + "2/19/12", "2/20/12", "2/21/12", "2/22/12", "2/23/12", "2/24/12", + "2/25/12", "2/26/12", "2/27/12", "2/28/12", "2/29/12", "3/1/12", + "3/2/12", "3/3/12", "3/4/12", "3/5/12", "3/6/12", "3/7/12", "3/8/12", + "3/9/12", "3/10/12", "3/11/12", "3/12/12", "3/13/12", "3/14/12",  + "3/15/12", "3/16/12", "3/17/12", "3/18/12", "3/19/12", "3/20/12", + "3/21/12", "3/22/12", "3/23/12", "3/24/12", "3/25/12", "3/26/12", + "3/27/12", "3/28/12", "3/29/12", "3/30/12", "3/31/12"], + suggestionLabels: ["Today", "Tomorrow", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", ""], + showOtherDateEntry: true, + otherDateLabel: 'Other...', + inputWidth: 127, + suggestionHighlightColor: "#0000ff", + suggestionHighlightTextColor: "#ffffff" +}; + +function openCalendar(args) { + var frame = document.getElementsByTagName('iframe')[0]; + var doc = frame.contentDocument; + doc.documentElement.innerHTML = '<head></head><body><div id=main>Loading...</div></body>'; + var commonCssLink = doc.createElement('link'); + commonCssLink.rel = 'stylesheet'; + commonCssLink.href = '../../Source/web/resources/pickerCommon.css?' + (new Date()).getTime(); + doc.head.appendChild(commonCssLink); + var buttonCssLink = doc.createElement('link'); + buttonCssLink.rel = 'stylesheet'; + buttonCssLink.href = '../../Source/web/resources/pickerButton.css?' + (new Date()).getTime(); + doc.head.appendChild(buttonCssLink); + var suggestionPickerCssLink = doc.createElement('link'); + suggestionPickerCssLink.rel = 'stylesheet'; + suggestionPickerCssLink.href = '../../Source/web/resources/suggestionPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(suggestionPickerCssLink); + var link = doc.createElement('link'); + link.rel = 'stylesheet'; + link.href = '../../Source/web/resources/calendarPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(link); + var commonJsScript = doc.createElement('script'); + commonJsScript.src = '../../Source/web/resources/pickerCommon.js?' + (new Date()).getTime(); + doc.body.appendChild(commonJsScript); + var suggestionPickerJsScript = doc.createElement('script'); + suggestionPickerJsScript.src = '../../Source/web/resources/suggestionPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(suggestionPickerJsScript); + var script = doc.createElement('script'); + script.src = '../../Source/web/resources/calendarPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(script); + + var pagePopupController = { + setValueAndClosePopup: function(numValue, stringValue) { + window.log('number=' + numValue + ', string="' + stringValue + '"'); + if (numValue == 0) + window.document.getElementById('date').value = stringValue; + }, + localizeNumberString: function(numString) { + if (typeof numString == "number") + return numString.toLocaleString(); + return numString.toString(); + }, + histogramEnumeration: function() {}, + formatMonth: function(year, zeroBaseMonth) { + var monthLabels = ['<January>', '<February>', '<March>', '<April>', '<May>', '<June>', + '<July>', '<August>', '<September>', '<October>', '<November>', '<December>']; + return monthLabels[zeroBaseMonth] + " " + year; + } + } + + setTimeout(function() { + frame.contentWindow.postMessage(JSON.stringify(args), "*"); + frame.contentWindow.pagePopupController = pagePopupController; + }, 100); +} + +function selected(select) { + var frame = document.getElementsByTagName('iframe')[0]; + frame.style.width = '100px'; + frame.style.height = '100px'; + switch (select.selectedIndex) { + case 0: + openCalendar(datalistArguments); + break; + case 1: + openCalendar(longDatalistArguments); + break; + case 2: + openCalendar(arabicDatalistArguments); + break; + case 3: + openCalendar(arabicLongDatalistArguments); + break; + } +} + +function log(str) { + var entry = document.createElement('li'); + entry.innerText = str; + document.getElementById('console').appendChild(entry); +} + +openCalendar(englishArguments); +</script> +</body> +</html> 
diff --git a/ManualTests/forms/list-picker.html b/ManualTests/forms/list-picker.html new file mode 100644 index 0000000..af87915 --- /dev/null +++ b/ManualTests/forms/list-picker.html 
@@ -0,0 +1,245 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset=utf-8> +<title>List Picker test</title> +<style> +body { + background-color: #eeffff; +} +iframe { + z-index: 2147483647; + width: 100px; + height: 100px; + border: 0; + overflow: hidden; +} +</style> +</head> +<body> + +<p>This is a testbed for list picker.</p> + +<div> +<select id="menu"> + <option value="0">foo</option> + <option value="1">bar</option> + <option value="2">bar</option> + <optgroup label=bar> + <option value="4">bar</option> + <option value="5">bar</option> + </optgroup> + <option value="6">bar</option> +</select> +<iframe srcdoc="<!DOCTYPE html>"></iframe> + +<ol id="console" style="font-family:monospace;"> +</ol> + +<script> +var pickerArguments = { + selectedIndex: 0, + children: [{ + type: "option", + label: "foo", + title: "", + value: 0, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, { + type: "option", + label: "bar", + title: "", + value: 1, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, { + type: "separator", + label: "bar", + title: "", + value: 2, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, { + type: "option", + label: "bar", + title: "", + value: 2, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, { + type: "optgroup", + label: "foo", + title: "", + ariaLabel: "", + disabled: false, + children: [{ + type: "option", + label: "bar", + title: "", + value: 3, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "700", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, + { + type: "option", + label: "bar", + title: "", + value: 4, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }], + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }, { + type: "option", + label: "bar", + title: "", + value: 5, + ariaLabel: "", + disabled: false, + style: { + color: "black", + backgroundColor: "transparent", + fontSize: "11px", + fontWeight: "400", + fontFamily: ["sans-serif"], + visibility: "visible", + display: "block", + direction: "ltr", + unicodeBidi: "normal" + } + }], + anchorRectInScreen: { + x: 1332, + y: 356, + width: 64, + height: 18, + }, +}; + +function openListPicker(args) { + var frame = document.getElementsByTagName('iframe')[0]; + var doc = frame.contentDocument; + doc.documentElement.innerHTML = '<!DOCTYPE html><head></head><body><div id=main>Loading...</div></body>'; + var commonCssLink = doc.createElement('link'); + commonCssLink.rel = 'stylesheet'; + commonCssLink.href = '../../Source/web/resources/pickerCommon.css?' + (new Date()).getTime(); + doc.head.appendChild(commonCssLink); + var listPickerCssLink = doc.createElement('link'); + listPickerCssLink.rel = 'stylesheet'; + listPickerCssLink.href = '../../Source/web/resources/listPicker.css?' + (new Date()).getTime(); + doc.head.appendChild(listPickerCssLink); + var commonJsScript = doc.createElement('script'); + commonJsScript.src = '../../Source/web/resources/pickerCommon.js?' + (new Date()).getTime(); + doc.body.appendChild(commonJsScript); + var listPickerJsScript = doc.createElement('script'); + listPickerJsScript.src = '../../Source/web/resources/listPicker.js?' + (new Date()).getTime(); + doc.body.appendChild(listPickerJsScript); + + var pagePopupController = { + setValue: function(stringValue) { + window.log('string="' + stringValue + '"'); + if (numValue == 0) + window.document.getElementById('menu').value = stringValue; + }, + setValueAndClosePopup: function(numValue, stringValue) { + window.log('number=' + numValue + ', string="' + stringValue + '"'); + if (numValue == 0) + window.document.getElementById('menu').value = stringValue; + }, + } + + setTimeout(function() { + frame.contentWindow.postMessage(JSON.stringify(args), "*"); + frame.contentWindow.pagePopupController = pagePopupController; + }, 100); +} + +function log(str) { + var entry = document.createElement('li'); + entry.innerText = str; + document.getElementById('console').appendChild(entry); +} + +document.getElementsByTagName('iframe')[0].onload = function () { + openListPicker(pickerArguments); +} +</script> +</body> +</html> 
diff --git a/ManualTests/frame-hover.html b/ManualTests/frame-hover.html new file mode 100644 index 0000000..c461295 --- /dev/null +++ b/ManualTests/frame-hover.html 
@@ -0,0 +1,5 @@ +<body> +<p style="height: 50px;">Move the mouse pointer into the yellow box, then directly into the green box, then out of both boxes. No red or cyan should remain, only yellow and green.</p> +<iframe src="resources/hover-subframe-1.html" frameborder="0" height="300" scrolling="no" width="200"></iframe><iframe src="resources/hover-subframe-2.html" frameborder="0" height="300" scrolling="no" width="200"></iframe> +</body> +</html> 
diff --git a/ManualTests/frames/nested-iframe-blit-on-scroll.html b/ManualTests/frames/nested-iframe-blit-on-scroll.html new file mode 100644 index 0000000..6d4d30e --- /dev/null +++ b/ManualTests/frames/nested-iframe-blit-on-scroll.html 
@@ -0,0 +1,31 @@ +<html> +<head> + <style type="text/css"> + iframe { + position: relative; + z-index: 1; + left: 10px; + top: 10px; + border: 1px solid black; + } + + #overlap { + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + left: 10px; + top: 100px; + background-color: blue; + } + p { + margin-top: 50px; + } + </style> +</head> +<body> +<div id="overlap"></div> +<iframe id="frame" src="resources/blit-on-scroll-subframe.html" scrolling="no"></iframe> +<p>The blue box should not get "smeared" when you scroll the inner iframe.</p> +</body> +</html> 
diff --git a/ManualTests/frames/resources/blit-on-scroll-subframe.html b/ManualTests/frames/resources/blit-on-scroll-subframe.html new file mode 100644 index 0000000..b0dc4b9 --- /dev/null +++ b/ManualTests/frames/resources/blit-on-scroll-subframe.html 
@@ -0,0 +1,10 @@ +<style type="text/css" media="screen"> + iframe { + border: 1px solid black; + } +  + body { + height: 1000px; + } +</style> +<iframe id="subframe" src="blit-on-scroll-subsubframe.html" width="280" height="250"></iframe> 
diff --git a/ManualTests/frames/resources/blit-on-scroll-subsubframe.html b/ManualTests/frames/resources/blit-on-scroll-subsubframe.html new file mode 100644 index 0000000..9084096 --- /dev/null +++ b/ManualTests/frames/resources/blit-on-scroll-subsubframe.html 
@@ -0,0 +1,10 @@ +<style type="text/css" media="screen"> + iframe { + padding: 10px; + } +  + body { + background-color: gray; + height: 1000px; + } +</style> 
diff --git a/ManualTests/full-screen-keypress.html b/ManualTests/full-screen-keypress.html new file mode 100644 index 0000000..716306d --- /dev/null +++ b/ManualTests/full-screen-keypress.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<script> + function enterFullScreen() { + var element = document.getElementById("fullscreen"); + element.innerText = "Press the space bar."; +  + var consoleDiv = document.getElementById("console"); + consoleDiv.innerHTML = "<span style='color:red'>FAIL</span>"; +  + document.addEventListener("keydown", function(event) { + consoleDiv.innerHTML = "<span style='color:green'>PASS</span>"; + document.webkitCancelFullScreen(); + }, true); +  + element.addEventListener("webkitfullscreenchange", function(event) { + if (!document.webkitIsFullScreen) + element.innerText = ""; + }, false); +  + element.webkitRequestFullScreen(); + } +</script> +<p>This test checks that keyboard events are received by an element in full screen mode. To run the test, press the 'Enter Full Screen' button then press the space bar. The test passes if the element exists full screen and you see the word 'PASS' below.</p> +<button onclick="enterFullScreen()">Enter Full Screen</button> +<div id="fullscreen"></div> +<div id="console"></div> \ No newline at end of file 
diff --git a/ManualTests/fullscreen/full-screen-flash.html b/ManualTests/fullscreen/full-screen-flash.html new file mode 100644 index 0000000..982fe65 --- /dev/null +++ b/ManualTests/fullscreen/full-screen-flash.html 
@@ -0,0 +1,28 @@ +<style> + body { background: green; color: white; } + document:-webkit-full-screen-document > body { background: red; } + span { text-decoration: underline; cursor: hand; } + div { + background: blue; + width: 200px; + height: 100px; + } + div:-webkit-full-screen { + width: 100%; + height: 100%; + } +</style> +<script> +function toggleFullScreen() { + if (document.webkitIsFullScreen) + document.webkitCancelFullScreen(); + else + document.getElementsByTagName('div')[0].webkitRequestFullscreen(); +} +</script> +<body> + This tests that the page does not have a visible "flash" when finishing the exit full screen animation. + <span onclick="toggleFullScreen()">Click to toggle full screen.</span> + <div> + </div> +</body> \ No newline at end of file 
diff --git a/ManualTests/fullscreen/full-screen-zero-width.html b/ManualTests/fullscreen/full-screen-zero-width.html new file mode 100644 index 0000000..f436b58 --- /dev/null +++ b/ManualTests/fullscreen/full-screen-zero-width.html 
@@ -0,0 +1,17 @@ +<style> + div { width: 0px; } + span { text-decoration: underline; cursor: hand; } +</style> +<script> +function toggleFullScreen() { + if (document.webkitIsFullScreen) + document.webkitCancelFullScreen(); + else + document.getElementsByTagName('div')[0].webkitRequestFullscreen(); +} +</script> +<body> + This tests that an element with a 0px width will not cause the window to disappear when entering full screen. <span onclick="toggleFullScreen()">Click to toggle full screen.</span> + <div> + </div> +</body> \ No newline at end of file 
diff --git a/ManualTests/go-back-after-alert.html b/ManualTests/go-back-after-alert.html new file mode 100644 index 0000000..b3a1e1a --- /dev/null +++ b/ManualTests/go-back-after-alert.html 
@@ -0,0 +1,7 @@ +<html> +<body> +This tests a bug where going back just before putting up an alert can lead to a crash. +<hr> +<a href="resources/alert-and-go-back.html">Click this link to run the test.</a> +</body> +</html> 
diff --git a/ManualTests/goBack-blank-tab-page.html b/ManualTests/goBack-blank-tab-page.html new file mode 100644 index 0000000..7a6157e --- /dev/null +++ b/ManualTests/goBack-blank-tab-page.html 
@@ -0,0 +1,19 @@ +<html> +<body> +<a href="resources/before-go-back.html" target="_blank"> +Link to open in a tab</a> +<br> +<br> +<u>Manual test :</u> +<br> +You need to open the above link in a new tab. In the opened page, just click on the link : if the webkit doesn't crash, the test has succeed. +<br> +<u>Details :</u> +<br> +This test checks if you can go back to a _blank-target previously tab-opened page. +<br> +If the webkit doesn't meet an assertion error : this test is Successfull. +<br> +When you click on the above link, one page (with _blank target) is loaded and this page will open a link and go back. +</body> +</html> 
diff --git a/ManualTests/harfbuzz-mouse-selection-crash.html b/ManualTests/harfbuzz-mouse-selection-crash.html new file mode 100644 index 0000000..a7e85a1 --- /dev/null +++ b/ManualTests/harfbuzz-mouse-selection-crash.html 
@@ -0,0 +1,54 @@ +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<style type="text/css"> +#telugu { +font-size: 2cm; +line-height: 1.5em; +font-family: "Lohit Telugu"; +} +</style> +<script> +var ITERATIONS = 10000; + +if (window.testRunner) + testRunner.waitUntilDone(); + +function mouseSelection() { + var body = document.body; + body.focus(); + + xStart = 0; + yStart = 0; + + if (window.eventSender) { + eventSender.mouseMoveTo(xStart, yStart); + eventSender.mouseDown(); + for(i=0;i<ITERATIONS;i++) { + randomCoord = randomCoordinate(); + eventSender.mouseMoveTo(randomCoord.x, randomCoord.y); + } + } + if (window.testRunnder) + testRunner.notifyDone(); +} + +function randomCoordinate(axis) { + return { x: Math.floor(Math.random()*window.innerWidth), + y: Math.floor(Math.random()* window.innerHeight) } +} + +</script> +</head> +<body onload="mouseSelection()"><p> + This test fuzzes HarfBuzzShaper::offsetForPosition to trigger an assertion in the downstream function characterIndexForXPosition(). + See https://bugs.webkit.org/show_bug.cgi?id=92376 - reason of the assertion being hit is a minuscule floating point inaccuracy  + between an if condition that gates the call to characterIndexForXPosition and the actual argument that's then given to the function. + This test works on WebKit EFL, with the Ubuntu Telugu Lohit font installed to the EFL jhbuild font directory, like:</p> + <pre>$ cp /usr/share/fonts/truetype/ttf-telugu-fonts/lohit_te.ttf WebKitBuild/Dependencies/Source/webkitgtk-test-fonts-0.0.3</pre> + <p>Run with:</p> + <pre>$ WebKitBuild/Debug/bin/DumpRenderTree ManualTests/harfbuzz-mouse-selection-crash.html</pre> + <p>Before the change, this would crash 10/10 times. Test passes if it does not crash.</p> +<p id="telugu">చేనేత కార్మికుల సమస్యలను ప్రభుత్వం దృష్టికి తీసుకువెళ్లేందుకు సిరిసిల్లలో వైఎస్ఆర్ సిపి గౌరవాధ్యక్షురాలు విజయమ్మ చేపట్టినదీక్ష విజయవంతమైంది.</p> +</body> +</html> 
diff --git a/ManualTests/hash-ref.html b/ManualTests/hash-ref.html new file mode 100644 index 0000000..ed15fdb --- /dev/null +++ b/ManualTests/hash-ref.html 
@@ -0,0 +1,25 @@ +<html> +<head> +<title>Manual Test for Bug 13067: Manually adding #hash to URL reloads entire page instead of jumping to #hash location in cached page</title> +<style> +li { padding-bottom: 12px; } +</style> +</head> +<body> +<h3>Manual Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=13067">Bug 13067: Manually adding #hash to URL reloads entire page instead of jumping to #hash location in cached page</a></h3> +<div> +<p>Instructions</p> +<ol> +<li>Click link to <a href="resources/hash-ref-test.html" target="_blank">open test page in new window</a>.</li> +<li>Set hash ref to "#div5" on the URL and hit <kbd>Enter</kbd>.<br> This should take you to the top of the div5 box <em>without</em> reloading the page.</li> +<li>Set hash ref to "#" on the URL and hit <kbd>Enter</kbd>.<br> This should take you to the top of the page <em>without</em> reloading.</li> +<li>Set hash ref to "#div3" on the URL and hit <kbd>Enter</kbd>.<br> This should take you to the top of the div3 box <em>without</em> reloading.</li> +<li>Hit <kbd>Enter</kbd> in the address bar without chainging the "#div3" hash.<br> This <em>should</em> reload the page.</li> +<li>Set hash ref to "#" on the URL and hit <kbd>Enter</kbd>.<br> This should take you to the top of the page <em>without</em> reloading.</li> +<li>Hit <kbd>Enter</kbd> in the address bar without chainging the "#" hash.<br> This <em>should</em> reload the page.</li> +<li>Delete the hash ref on the URL and hit <kbd>Enter</kbd>.<br> This <em>should</em> reload the page.</li> +<li>Go back in history 5 times to the first URL.<br> <em>None</em> of the pages should be reloaded.</li> +<li>Go forward in history 5 times to the last URL.<br> <em>None</em> of the pages should be reloaded.</li> +</div> +</body> +</html> 
diff --git a/ManualTests/iframe_notifications/iframe-reparenting-close-window-child.html b/ManualTests/iframe_notifications/iframe-reparenting-close-window-child.html new file mode 100644 index 0000000..7758115 --- /dev/null +++ b/ManualTests/iframe_notifications/iframe-reparenting-close-window-child.html 
@@ -0,0 +1,29 @@ +<html> +<script> + +var iframe; + +window.addAndTransferIframe = function() +{ + iframe = document.createElement('iframe'); + iframe.setAttribute('width', '500'); + iframe.setAttribute('height', '350'); + iframe.setAttribute('src', 'iframe-reparenting-close-window-iframe.html'); + window.document.body.appendChild(iframe); +} + +// Called from Iframe when it is loaded and initialized. +window.transferIframe = function() +{ + var backgroundWin = window.opener; + backgroundWin.log("Transferring Iframe now."); + backgroundWin.document.adoptNode(iframe); + backgroundWin.document.body.appendChild(iframe); + iframe.contentWindow.finish(); + window.close(); +} +</script> + +<body> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/iframe_notifications/iframe-reparenting-close-window-iframe.html b/ManualTests/iframe_notifications/iframe-reparenting-close-window-iframe.html new file mode 100644 index 0000000..219a2b4 --- /dev/null +++ b/ManualTests/iframe_notifications/iframe-reparenting-close-window-iframe.html 
@@ -0,0 +1,24 @@ +<html> +<head> +<script> +var logWin = window.parent.opener; +logWin.log('Initializing Iframe'); + +function test() { + logWin.log("Before transfer: permission returned (should be denied): " + Notification.permission); + setTimeout("window.parent.transferIframe();", 5000); // Wait long enough for Chrome popup blocker to release the window so it can actually close. +} + +function testAfterClose() +{ + logWin.log("After transfer: permission returned (should be granted): " + Notification.permission); +} +window.finish = function() { + logWin.log("After transfer, the permission call is accessing a destroyed object and can return invalid value or crash, depending on circumstances."); + setInterval(testAfterClose, 1000); // Do it several times in a row, it'll crash after 1-3 times +} +</script> +</head> +<body onload=test()> +</body> +</html> 
diff --git a/ManualTests/iframe_notifications/iframe-reparenting-close-window.html b/ManualTests/iframe_notifications/iframe-reparenting-close-window.html new file mode 100644 index 0000000..66e47e6 --- /dev/null +++ b/ManualTests/iframe_notifications/iframe-reparenting-close-window.html 
@@ -0,0 +1,31 @@ +<html> +<script> +window.log = function(message) +{ + document.getElementById("log").innerText += message + "\n"; +} + +function childLoaded() +{ + log("Child window loaded."); + window.childWindow.addAndTransferIframe(); +} + +function start() +{ + window.childWindow = window.open("iframe-reparenting-close-window-child.html", "_blank"); + window.childWindow.addEventListener("load", childLoaded, false); +} + +</script> +<body> +<p>Bug: https://bugs.webkit.org/show_bug.cgi?id=70147</p> +<p>This test recreates scenario when an iframe is reparented from one page to another using 'live iframe transfer' + (with adoptNode() used on the iframe right before re-parenting into the other page's DOM tree). + Then the original page is closed, destroying some internal objects that are associated with the top frame/page/WebVeiw.</p> +<p>In Chromium, this destroys the underlying NotificationPresenter object which is associated with the Page, and as a result, the use of webkitNotification object from JavaScript can crash the browser or return bogus results ('use-after-delete'). + Open this test in Chromium and click the button to start the test. If the test doesn't crash, and prints expected results, the bug is not regressed.</p> +<button onclick="start()">Start test</button> +<pre id="log"></pre> +</body> +</html> 
diff --git a/ManualTests/image-document-zoom.html b/ManualTests/image-document-zoom.html new file mode 100644 index 0000000..0f65ec9 --- /dev/null +++ b/ManualTests/image-document-zoom.html 
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"/> + <title>bug 110993 : ImageDocument 's incorrect zoom behavior.</title> + </head> + <body> + <p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=110993">bug 110993</a> : ImageDocument 's incorrect zoom behavior.</p> + <ol> + <li>Open this image link on your browser. <a href="resources/200x200.png">resources/200x200.png</a></li> + <li>Make the browser window(rendering area)'s height and width about 3 times bigger than the image.</li> + <li>Zoom in several times until the image gets bigger than the browser window using keyboard shortcut (e.g., ctrl + '+' in Linux Chrome)</li> + <li>Zoom back to the original state (100%) using keyboard shortcut (e.g., ctrl + '-' in Linux Chrome)</li> + <li>If the image size is 200x200, pass, otherwise, fail.</li> + </ol> + </body> +</html> \ No newline at end of file 
diff --git a/ManualTests/image-prefetch-stress.html b/ManualTests/image-prefetch-stress.html new file mode 100644 index 0000000..b9203b7 --- /dev/null +++ b/ManualTests/image-prefetch-stress.html 
@@ -0,0 +1,20 @@ +<html> +<script type="text/javascript"> +(function(){ + var i = 0; +setInterval(function(){ + var x = new Image(); + x.src = "http://upload.wikimedia.org/wikipedia/commons/e/e9/Sombrero_Galaxy_in_infrared_light_%28Hubble_Space_Telescope_and_Spitzer_Space_Telescope%29.jpg?" + i; + i++; + }, 500); +})() +</script> +<body> +When an image is preloaded in javascript, the size of the image is never +reported to the javascript garbage collector. If a large image is repeatedly +preloaded but never used, it will not free any of the images until the +garbage collector has run out of space to allocate any new free javascript +variables. This test passes if after a certain point, the number of allocated +images as reported by the caches window stops growing. +</body> +</html> 
diff --git a/ManualTests/image-resampling-with-scale.html b/ManualTests/image-resampling-with-scale.html new file mode 100644 index 0000000..35a1a8c --- /dev/null +++ b/ManualTests/image-resampling-with-scale.html 
@@ -0,0 +1,33 @@ +<!DOCTYPE HTML> +<html> +<head> +<script> +// Image of the Chrome logo. An image with features (i.e., not a green square) is necessary for noticing resampling noise. +var imgSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAADCpJREFUaIHtmXuMHdV9xz/nzNy5+7j78Pqx1/Y+WHbt9QsbkSh1YowJUUIUoQTSPFS1pbRBkDilUqOoSlRSRa1VRbSVWiFDqkBD0iqJBEmpiHARIGIIJcGYxhgw2Iux2di7Xq93vY+79zHn0T/OzNzZu3cfJG3+qHJWs3Pm3jtnvt/f+Z7f4wz8tv22/VpN/G+McfPdD12ZoeGT0s9cZ4XoFcK7qjq8dT0B1ujjWH3WGP1saEo/evTAbaeTH/yqD/817pW/e/e/fS4TBHdJmbkKBFJKBALp+XUeZNFGY63FGA3Woo06rsLSvT88cOuDgPlNEZA3f+Wh27PZxrul53d7vofv+c7ESw4bGdra6MqilSJUCq3UcDksHnjsG3/yAO+SyLshIG7cf7C/sb31oUwm2OP7PhnfAReQEBBLDmmxgLUWrLuy1hIqRRiGqLD8/NR04bbD933xLVYoLW+F4OVH/vS+z2Rb234sPW9TEARIIeY/IWXZ+c+21T9bPQwWYy3GuDuEFChtezw/uK1r1w2nz7x06MRKSKyEgNz3hXvvyOZaH5KezGb8TASL5Bxb1UZEYpBYBzIBnT6MwRiDtgZtDNpYEBJtTRbpf2r9zhtGh4/+58vLkViOgNx9+z/dkW3O3S89ief5RLiIsKasmupHhGLwxpjE2sYad44OHR/aoo3BWFDGYoV/U37n9aPnXn5iSRJLEZDvufWezwbNrd/2PA/peRG4lBSIgBtSVsbJIiKgTXROgJvoc4PWsfWrs6CMG9NYi5CZm9Zt3fvmyLEnX1+MxGIExPZb/mJL0+r8o1J6WSk9N2hidTeaSUvD1IBPWdidTdJXOg0+PQPuewApJdZaZCbz4baubY9efOP5S/WALnTY0ed7PvSxB1959Y1WP+t+YqwFbTEChBBIIxBRX1Dtw0LXlqwN5svOxNKLZnIBCN/HGNOaW9fzILAPCFcyA/LP/vnw59d0rr/T9zNMTEwipZwPKJpiY+y8szYGHV3rSD4qpe/Y2sa6fjyTSzXP87CW7rXb9l4YOfbkUWpuqTcD2ebWjq/6vseVV/Zw7vwIpVIZP1NfbbEFq8Naco0BAxs76N/QAViGzk0yW1IoszhckfyrxpI4Nmqtsbrjqy/DvwDFBfelmrzr/mf2t61df29TQwOeJzh9Zpjjx08ghCATLKY413b15/mjG3dxdX8+SYOShY5lsqA4Oz7H1Jyah0AgkDKSpkifQQonTxWGjF88f9cnrr36PlLRuhZR0JBbtd/3vIT9FT1dDA+fZ3LyMpVySBBkFtDONQZ8+bMfYM+OHs5PlHj61XEuTIUUKxqEoL3Jp73JYyDfzFXdLYzPhAyNFhadEQF4UuBLgZSOjC982tvX7AceAErxb9O6ELd86d7tnb2bvxYEAVIKt0CFIAiynDs3grUWrQ1eimBzY8Df3flhBnvWcejoGC+8OcmlmZCKMslaKRQ1Y1NlTgzPMna5zODGZla3BIzPhFiclQNfks1IGqLD90SEIZKGlIBYO7B55yNPHfr3sUQyKQJeZ9+2mxE1eRmwPr+GfL7TAdKGsFJ1Bl/69PvZsKaNHzz7S06en3ULVhuUMoTKEIbuHH8+NFLg4Z+OIIVgIN9Ee1OGjlyGXINH1pd4cun0bHDnjpvThk8TyARNTdfWehxwmhwc7HceAVCholyqsHtbF7u3dfHYi6OMTJTQ2vn4MAavNKEyqPgcfT86WeLQS6O0NvjkGlaajrlZaGzKXQtk6hLIeNltUsi6vm1Vewvd3V1J2hCGipt2b+bMhTlOvDPtwCuDWmB9nZBRSqOUC2JvDs9ydmyOtsalHUMtgYZs47bFCPgyyG4QUkYZ5cK2Y/tmstks1lryq1q4aiDPCycuOclER2L9UM+TUEwqJqi04djpywS+W6zLNYtTghcEG0g5nzQBGYXMBQlx3IKMx+DgJgA6V+ew1jJ0ftZJIwKp1Hyrh0o7MikiMdnTIwWsZVndJwyqnQR3ev5EEtLjcF+nPOnv6+LMmXfYOZDHWpieC/E9iTGRy4v8uRDz742lF0dubSwXp8pYLIEvKCuWbalMOBnar/cDYy3SCndR45I8T7Jjx1asLWOspaJd+uBLlx95ifutPiWa2KgWIEk1lHbp80pKr1gVtaFjHoG42JBWRMmWwKszu/nODgoz4xgLUgoqyqClQIr4ICERP90SgU/NQCbjMs6KWroMriaAUVK5GIH5BYpIzrVxQQpBQ/sarLX0djbx2tkppHDWl5F8JMyL2PHYxpIkfP0bc+56mTI+zmId+fnfpQnYSrk4mg0yeSmFKyisQFqbpMnpVjGCsZmQbT2tHB2aTMDLVP6ywDjMl9C121YT6qicXBK8u6+iNLOzM6dIqS7thUy5MHNSKY01UWFiqjl7vfbGSJHdgx1ckW+iFGrKSlNSmlJY51CaUmiSfm9nE/0bchTKK5GPs77ShkJhbgTQ9QiomctjLyqta4pvu0B3cXvrYomRqQr7P9aP54kIrKGoNMUEuFlAZl17ljs/2k9FGSpqCeunZWcgDDVjFy68uBiBcOjo04fSZWDtUa8dPjlNMbTc88c76cs311jdgS+mPuvLN/PlWwaREqaLi1s/0bwlKYxCY/mvZx4/RKoySyvVBzpvP/j8T1pa2weygY/nSTxP4EmXZHlRelvbAk+wd3Mr61ozPPvqGEeGJnnp1ETVBVvLezd18N6BVVy3fS0jlysYA03ZRYqkiEBcwYXaUiwrLl6aGPr967dcD1wAVAw6bhqYu3D6te81bP+dv/J9DyEsArevmYZdS6KiLU+fmKJvTZYdfavYu33tPDDxv4mC4rk3p7AWdnTllgQfS1fFBCohJ19/5XvAHCkJ1ZqzAei+/b6fPZfL5TqDwHfWT82CTIqMhZ4mbs1Z6YqYRmfhsakKkwXFbFnjS8EHt7bXtX6y25EEOkslsv7E5ekLf7Bv015gmFRBU5s7V4DJ0VO/+FYlVMlWR5zLJ4V5sglVf10UyoZzkxVeO1/k+C/nGJ4oM1t2RtuyvnEB+LSfj/WutLN8RVnmyiGv/feRbwGTEcak1ZrBAvbkz3789tZ9n7lO+kHe87xEywvgxvE9qsjrzUh6ryeX9djV0zJPguk9pjhGxLKpKMvMXImL4xePfeUPP3I3cImarZV6q8gAtlwunNq49f2fEEIE1SJnYXSKNW6xKb1Xf6tSacLVvTnamvzUPVU36axPFby2FIoVZovlwg8OfmP/228cOwkUau1Yj4AF1PjZ12faNgxMr8r3fcgiEBGJ2GLxtEM1T8Ha1O6dW4ShdrXx+raAzfkmIMqzIEorXGrh3CSE2lBWlrmSYraseOGZx7/+8Df/9gmcfHQt2MXqOQuoMy8/9c6a7i2llnXde8AlaGkr25QVsfOBxxsAxlg8IbjmihayvoysHbvIyMdrCLUlVNaBL4fMlkJeeu7pe+7/2h3fBS5So/3lCBCxDd868sSpju4txZa1PXuMtdGe5fztwqR+sGCTzVlQxhG4Ym0DGzsanLUjmShDtFCdG64oS0lZZosVZkuKo889ec/Bv/zcgzifX4SFS3A5AhYXLMqnjzxxqmVN18WWdb3vM8YGMiru06E+vcUeXyttyPqSnb2tgHCgUxavREc5Aj9dKDE9Vy688NR/HHjgr7/4r8AITveLhuzltgQSEmd/8czp2fHRn6/u27lV+JlO64rUFPCUfAzu5YWxbMo309acSXYkEuCRXEqhoVAKmZ6rMDY2dvzhg1//88e/849PRpZfEjys/B2ZxAW5VUDnDXf+w+9t3PK+W4PGpnUZ38dFbVdCxoWMtZaWRp9r+tsR8cJNeRttLKVQUSor5gqFsRNHf/rdb//N578fAZ/EBatlX/i9q5d8uNSjBVgNrP7gHX//qQ2brvlktrm1TwiB50mklNGOsmVHbxstjZnEzyulqzsXxjI7ffntt175+Y++c+ALj+B8/CVgBjfrK6k0f7XXrEAWaMbNSHvve24cGPzAx/e1rOve1dCQ68w0tfa1NWfo6cxByvrF2am3C4XpC5fOnT125KlHDr9y+LEh4DLO4gWgzP/ha9Z6RAKgEWgCclG/AbfxVJumGFwULeG8yiwuMSviXORv7EV3vTE8HOhM1PfqjG1xrlnjiIRRf0VS+X/b/geyPrDn1efsgAAAAABJRU5ErkJggg=="; + +var intervalId = null; +function doScaleTest() { + var scale = 0.5; + var image1 = document.getElementById('image1'); + var image2 = document.getElementById('image2'); + var layer2 = document.getElementById('layer2'); + + image1.setAttribute('src', imgSrc); + image2.setAttribute('src', imgSrc); + intervalId = setInterval(function() { + scale += 0.001; + image1.style.webkitTransform = 'scale(' + scale + ')'; + layer2.style.webkitTransform = 'scale(' + scale + ')'; + if (scale > 1.5) + window.clearInterval(intervalId); + }, 10); +} +</script> +</head> +<body onload="doScaleTest()"> +Test for crbug.com/151538. This test passes if both Chromium logos smoothly scale up and look identical as they scale. +<img id="image1" style="position: absolute; top: 45px; left: 35px;" width="100" height="100" > +<div id="layer2" style="position: absolute; top: 180px; left: 35px;"> + <img id="image2" width="100" height="100" > +</body> +</html> 
diff --git a/ManualTests/ime-keydown-preventdefault.html b/ManualTests/ime-keydown-preventdefault.html new file mode 100644 index 0000000..aa474e9 --- /dev/null +++ b/ManualTests/ime-keydown-preventdefault.html 
@@ -0,0 +1,27 @@ +<html> +<body> +<p>Typing in the input fields below should not generate text, even with an IME enabled.</p> + +Type into the input: +<input type=text id='input'></input><br> +<div id='out' style="float: right"></div> +Or the text area: +<textarea id='area'></textarea><br> +Or the contentEditable area: +<div contentEditable id='ce' style="border:1px solid red; height:300px; width:300px;"></div> +<script> +var input = document.getElementById('input'); +var area = document.getElementById('area'); +var ce = document.getElementById('ce'); + +var handleKeyDown = function(e) { + document.getElementById('out').innerHTML += "<br>Got a key event -- cancelling"; + e.preventDefault(); +} + +input.addEventListener('keydown', handleKeyDown, false); +area.addEventListener('keydown', handleKeyDown, false); +ce.addEventListener('keydown', handleKeyDown, false); +</script> +</body> +</html> 
diff --git a/ManualTests/indexeddb-persists.html b/ManualTests/indexeddb-persists.html new file mode 100644 index 0000000..86c157e --- /dev/null +++ b/ManualTests/indexeddb-persists.html 
@@ -0,0 +1,69 @@ +<html> +<body> +<p>This is a test that only applies to IndexedDB. <span id=enabled>Our test for whether you have it enabled seems to have failed.</span></p> + +<p>Please follow these steps in order:</p> + +<p>First, click <a href="javascript: setData()">here</a> to open a database and set some data within it.</p> + +<p>Next, close the browser and then re-open this page.</p> + +<p>Lastly, click <a href="javascript: verifyData()">here</a> to verify the data was there</p> + +<p>Status: <span id=status>...</span></p> + +<script> + +if (!('indexedDB' in window)) + document.getElementById("enabled").innerHTML = "<font color=red>Your build does NOT seem to have it enabled. So all code on this page is disabled.</font>"; +else + document.getElementById("enabled").innerHTML = "<font color=green>Your build seems to have it enabled.</font>"; + +function status(str, color) +{ + if (color) + str = "<font color='" + color + "'>" + str + "</font>"; + document.getElementById("status").innerHTML = str; +} + +function setData() +{ + status("Something must have gone wrong (or we're still working)...", "red"); + + indexedDB.open("someDB", "some description").onsuccess = function() { + event.result.setVersion("some version").onsuccess = function() { + var db = event.source; + while (db.objectStoreNames.length) + db.removeObjectStore(db.objectStoreNames[0]); + db.createObjectStore("test").put("value", "key").onsuccess = function() { + status("Value set", "green"); + } + } + } +} + +function verifyData() +{ + status("Something must have gone wrong (or we're still working)...", "red"); + + indexedDB.open("someDB", "some description").onsuccess = function() { + try { + var result = event.result.transaction([]).objectStore("test").get("key"); + result.onsuccess = function() { + if (event.result == "value") + status("Value verified", "green"); + else + status("Value incorrect!", "red"); + } + result.onerror = function() { + status("An error occurred: " + event.code + " " + event.message, "red"); + } + } catch (e) { + status("An exception occurred: " + e, "red"); + } + } +} + +</script> +</body> +</html> 
diff --git a/ManualTests/inline-input-marking.html b/ManualTests/inline-input-marking.html new file mode 100644 index 0000000..4c62cd4 --- /dev/null +++ b/ManualTests/inline-input-marking.html 
@@ -0,0 +1,38 @@ +<html>  +<head> + +<style> +.editing {  + border: 2px solid red;  + padding: 12px;  + font-size: 24px;  +} +.inputtest { + font-family:'Hiragino Kaku Gothic Std'; + border: 2px solid green;  +} +</style> + +<title>Inline Input Method Marking</title>  +</head>  +<body> +<p>This tests that the underlining of the inline input hole does not obscure the glyphs.</p> + +<ol> +<li>Switch to Hirigana input method</li> +<li>Type characters into each of the green blocks below</li> +<li>As you do so, check that glyphs in the inline hole are clearly readable</li> +</ol> +<div contenteditable id="root" class="editing" style="width:400px;"> +9px Hiragino Kaku Gothic Std<div class="inputtest" style="font-size: 9px;"><br></div> +<br>12px Hiragino Kaku Gothic Std<div class="inputtest" style="font-size: 12px;"><br></div> +<br>24px Hiragino Kaku Gothic Std<div class="inputtest" style="font-size: 24px;"><br></div> +</div> + +<script> +runEditingTest(); +</script> + +</body> +</html> + 
diff --git a/ManualTests/inline-repaint-container.html b/ManualTests/inline-repaint-container.html new file mode 100644 index 0000000..5e68263 --- /dev/null +++ b/ManualTests/inline-repaint-container.html 
@@ -0,0 +1,12 @@ +<div style="transform: translatez(0)"> +</div> +<div style="position: relative;"> + <span style="position: relative; z-index: 10; top: 40px; left: 30px;"> + <span style="position: relative; top: 50px; font: 60px ahem; color: red;" id="target">X</span> + </span> +</div> +<script> + setTimeout(function() { + document.getElementById("target").style.color = "green"; + }, 0); +</script> 
diff --git a/ManualTests/input-empty-on-focus.html b/ManualTests/input-empty-on-focus.html new file mode 100644 index 0000000..7cfc3ff --- /dev/null +++ b/ManualTests/input-empty-on-focus.html 
@@ -0,0 +1,6 @@ +<div><img width="200" height="200" src="resources/200x200.png"></div> +<div><input onfocus="this.value = ''" value="drop image here go boom"></div> +<p>Drag the image above down into the text field. +If the test succeeds there will be no crash and you'll end up with an empty text field with a blinking caret. +It's arguably a bug that the text field accepts an image at all, so some day we might fix that and make this +test obsolete. Maybe we can find some other way to test the same code path.</p> 
diff --git a/ManualTests/input-file-hidden-open-dialog-on-click.html b/ManualTests/input-file-hidden-open-dialog-on-click.html new file mode 100644 index 0000000..e8042db --- /dev/null +++ b/ManualTests/input-file-hidden-open-dialog-on-click.html 
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset='utf-8' /> + <title>Test that file dialog opens when click() is called </title> +</head> +<body> +Test manually that when you click on "Click me" button, an file open dialog appears. +<input id=fileinput type="file" hidden /> +<button onclick="document.getElementById('fileinput').click();">Click me</button> +</body> +</html> 
diff --git a/ManualTests/input-number-localization.html b/ManualTests/input-number-localization.html new file mode 100644 index 0000000..631cc70 --- /dev/null +++ b/ManualTests/input-number-localization.html 
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<title>Number type input shows and accepts localized numbers</title> +<style> +:invalid { + border-color: red; + -webkit-box-shadow: 4px 4px 8px #ff8888; +} +</style> +</head> +<body> +<div id="console"></div> + +<p>Output test 1: The following text field should have a localized representation for "-1234.5678". +e.g. "-1234.5678" for en_US locale, "-1234,5678" for fr_FR locale. The thousand separator is +currently off.</p> +<div><input type=number value="-1234.5678" step=any></div> + +<p>Output test 2: The following text field should have "-1234.5678E+12" in any locale. +</p> +<div><input type=number value="-1234.5678E+12" step=any></div> + +<p>Input test 1: Type a localized representation of a number (e.g. -1,234.5678 for en_US locale, +-1.234,5678 for fr_FR locale) into the following text field. +You'll see an equivalent number in the standard format on the bottom of the text field.</p> +<p>Input test 2: Type a number in the scientific notation (e.g. 0.1234e-10.) +You'll see the same number string on the bottom of the text field.</p> +<div><input type=number id=target step=any oninput="handleInput()"></div> +<div>Standard format: <output id=output></output></div> + +<script> +function handleInput() { + document.getElementById('output').value = document.getElementById('target').value; +} +</script> +</body> +</html> 
diff --git a/ManualTests/input-starved-by-timers.html b/ManualTests/input-starved-by-timers.html new file mode 100644 index 0000000..f26cfa7 --- /dev/null +++ b/ManualTests/input-starved-by-timers.html 
@@ -0,0 +1,51 @@ +<html> +<head> +<script> +function log(m) { + document.getElementById("log").innerHTML += m + "<br>"; +} + +var multiplyFactor = 2; // Create this many timers in every timer callback. +var targetLatency = 10000; // Multiply timers until it takes this much to fire all their callbacks. +var timerCount = 1; + +function timerCallback(creationTimestamp) { + --timerCount; + + if (!multiplyFactor) { + if (timerCount == 0) + log("No more timers - UI should be responsive now."); + return; + } + + // Create more timers. Capture the current time so when callbacks are fired, + // we can check how long it actually took (latency caused by a long timer queue). + var timestamp = new Date().getTime(); + for (i = 0; i < multiplyFactor; ++i) { + setTimeout(function() { timerCallback(timestamp); }, 0); + ++timerCount; + } + + // Once the timer queue gets long enough for the timer firing latency to be over the limit, + // stop multplying them and keep the number of timers constant. + if (multiplyFactor > 1 && new Date().getTime() - creationTimestamp > targetLatency) + multiplyFactor = 1; +} + +function runTest() { + log("Freezing UI..."); + setTimeout(function() { timerCallback(new Date().getTime()); }, 0); + setTimeout("multiplyFactor = 0; log('Finishing. Started to drain timers.');", 10000); +} + +</script> +</head> +<body onload="runTest()"> +This test will create enough timers to freeze browser UI. After 10 seconds, it +will start drain the timers so the UI becomes responsive again in a few seconds. +You don't need to kill the browser.<br>If the bug is fixed, there will be no +UI freeze. Refresh the page to repeat the experiment.<br>Try to click at this +button (or browser's menu) while UI is frozen: <button onclick="log('clicked')">Click Me</button> <hr> +<div id="log"></div> +</body> +</html> 
diff --git a/ManualTests/input-type-datetime-default-value.html b/ManualTests/input-type-datetime-default-value.html new file mode 100644 index 0000000..8be15d8 --- /dev/null +++ b/ManualTests/input-type-datetime-default-value.html 
@@ -0,0 +1,80 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head><title>Default values for date/time input (type= date, datetime, datetime-local, month, time, week)</title></head> + +<p>Enter Up or Down, or click the spin buttons for each input field.</p> + +<form> + <ul> + <li>Emtpy values, no steps + <ul> + <li>date: <input type="date" size="32" value="" /> + <li>datetime: <input type="datetime" size="32" value="" /> + <li>datetime-local: <input type="datetime-local" size="32" value="" /> + <li>month: <input type="month" size="32" value="" /> + <li>time: <input type="time" size="32" value="" /> + <li>week <input type="week" size="32" value="" /> + </ul> + <li>Invalid values, no steps + <ul> + <li>date: <input type="date" size="32" value="foo" /> + <li>datetime: <input type="datetime" size="32" value="foo" /> + <li>datetime-local: <input type="datetime-local" size="32" value="foo" /> + <li>month: <input type="month" size="32" value="foo" /> + <li>time: <input type="time" size="32" value="foo" /> + <li>week <input type="week" size="32" value="foo" /> + </ul> + <li>Emtpy values, invalid steps + <ul> + <li>date: <input type="date" size="32" value="" step="foo" /> + <li>datetime: <input type="datetime" size="32" value="" step="foo" /> + <li>datetime-local: <input type="datetime-local" size="32" value="" step="foo" /> + <li>month: <input type="month" size="32" value="" step="foo" /> + <li>time: <input type="time" size="32" value="" step="foo" /> + <li>week <input type="week" size="32" value="" step="foo" /> + </ul> + <li>Invalid values, invalid steps + <ul> + <li>date: <input type="date" size="32" value="foo" step="foo" /> + <li>datetime: <input type="datetime" size="32" value="foo" step="foo" /> + <li>datetime-local: <input type="datetime-local" size="32" value="foo" step="foo" /> + <li>month: <input type="month" size="32" value="foo" step="foo" /> + <li>time: <input type="time" size="32" value="foo" step="foo" /> + <li>week <input type="week" size="32" value="foo" step="foo" /> + </ul> + <li>Emtpy values, step=any + <ul>s + <li>date: <input type="date" size="32" value="" step="any" /> + <li>datetime: <input type="datetime" size="32" value="" step="any" /> + <li>datetime-local: <input type="datetime-local" size="32" value="" step="any" /> + <li>month: <input type="month" size="32" value="" step="any" /> + <li>time: <input type="time" size="32" value="" step="any" /> + <li>week <input type="week" size="32" value="" step="any" /> + </ul> + <li>Invalid values, step=any + <ul> + <li>date: <input type="date" size="32" value="foo" step="any" /> + <li>datetime: <input type="datetime" size="32" value="foo" step="any" /> + <li>datetime-local: <input type="datetime-local" size="32" value="foo" step="any" /> + <li>month: <input type="month" size="32" value="foo" step="any" /> + <li>time: <input type="time" size="32" value="foo" step="any" /> + <li>week <input type="week" size="32" value="foo" step="any" /> + </ul> + </ul> +</form> + +<p>The input fields should show the current local/UTC date/time (with + or - a unit date/time described below except for step=any).</p> + +<p>Unit dates/times</p> +<ul> + <li>date: 1 day (local time) + <li>datetime: 1 minute (UTC) + <li>datetime-local: 1 minute (local time) + <li>month: 1 month (local time) + <li>time: 1 minute (local time) + <li>week: 1 week (local time) +</ul> + +<p>As for step=any, the values don't change by stepping-up/-down.<p> + +</body></html> 
diff --git a/ManualTests/input-type-file-autocomplete-frame-1.html b/ManualTests/input-type-file-autocomplete-frame-1.html new file mode 100644 index 0000000..6abc90c --- /dev/null +++ b/ManualTests/input-type-file-autocomplete-frame-1.html 
@@ -0,0 +1,23 @@ +<html> +<body> +<p><b>BUG ID:</b> <a href="<rdar://problem/4532113> REGRESSION (NativeTextField): Crash occurs after modifying field then reloading page -[FormDelegate frameLayoutHasChanged:]">4532113</a> REGRESSION (NativeTextField): Crash occurs after modifying field then reloading page -[FormDelegate frameLayoutHasChanged:]</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ol> +<li> enable Safari's auto fill +<li> type something in the input field, and press enter to register it with autofill +<li> clear the field and type part of the same string you did previously +<li> without ever removing focus from the input field, select the suggestion autofill suggests +<li> refresh the page or go to a bookmark (don't remove focus from the input field) +</ol> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +no crash.  +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Crash in -[FormDelegate frameLayoutHasChanged:] +</p> +</body> +</html> 
diff --git a/ManualTests/input-type-file-autocomplete-frame-2.html b/ManualTests/input-type-file-autocomplete-frame-2.html new file mode 100644 index 0000000..d3cd114 --- /dev/null +++ b/ManualTests/input-type-file-autocomplete-frame-2.html 
@@ -0,0 +1,7 @@ +<html> +<body> +<table><tr><td> +<form><input size=55 value="type something in here"></form> +</td></tr></table> +</body> +</html> 
diff --git a/ManualTests/input-type-file-autocomplete-refresh.html b/ManualTests/input-type-file-autocomplete-refresh.html new file mode 100644 index 0000000..eea8dab --- /dev/null +++ b/ManualTests/input-type-file-autocomplete-refresh.html 
@@ -0,0 +1,10 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> + +<frameset rows="50%,50%">  + <frame src="./input-type-file-autocomplete-frame-1.html">  + <frame src="./input-type-file-autocomplete-frame-2.html"> +</frameset> + +</html> 
diff --git a/ManualTests/input-type-file-drag-drop.html b/ManualTests/input-type-file-drag-drop.html new file mode 100644 index 0000000..eccc6e8 --- /dev/null +++ b/ManualTests/input-type-file-drag-drop.html 
@@ -0,0 +1,18 @@ +<body> +<div style="background-color: black;" width="300"> +<input type=file> +</div> +<div style="background-color: blue;" width="300"> +<input type=file> +</div> +<input type=file> +<p> +&lt;input type="file"&gt; should be able to support drag and drop of files. Use the above controls to demonstrate: +</p> +<ol> +<li> Accepting normal file drags (indicating accpetance during hover). +<li> Rejecting diretory and non-normal file drags. +<li> Dropping a symlink'd file should accpect/show/upload the target, not the symlink itself. +<li> Rejecting of file-promise drags (this is probably a bug, not a feature). +</ol> +</body> \ No newline at end of file 
diff --git a/ManualTests/input-type-text-unconfirmed-inline-input.html b/ManualTests/input-type-text-unconfirmed-inline-input.html new file mode 100644 index 0000000..857a63e --- /dev/null +++ b/ManualTests/input-type-text-unconfirmed-inline-input.html 
@@ -0,0 +1,20 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head><title>Unconfirmed inline input in <input type=text></title></head> + +<script> + +function dump(s) { + if (s == "") + alert("Field appears empty"); + else + alert("Field contents: " + s); +} + +</script> + +<p>Enter some text using inline input (e.g. Kotoeri Hiragana) and click the button without closing the input area.</p> +<p><input type=text id=input value="" size=57><input type=button value="test" onClick="dump(document.getElementById('input').value)"></div> +<p>The alert should show the inline input text, but without the bug fix it shows empty text.</p> + +</body></html> 
diff --git a/ManualTests/inspector-document-methods-override.html b/ManualTests/inspector-document-methods-override.html new file mode 100644 index 0000000..ca53f25 --- /dev/null +++ b/ManualTests/inspector-document-methods-override.html 
@@ -0,0 +1,14 @@ +<p>This page test that using the Web Inspector's search field on a page that +overrides <tt>Document.evaluate</tt> or <tt>Document.querySelectorAll</tt> +still works.<p> + +<p>To test, right-click on this page and select &ldquo;Inspect Element&rdquo;, +then type &ldquo;p&rdquo; in the search field (without the quotes). If the +search results list appears, then you have passed the test. If one or more +alert dialogs appear, you have failed the test.</p> + +<script> + function fail() { alert('FAIL') } + document.querySelectorAll = fail; + document.evaluate = fail; +</script> 
diff --git a/ManualTests/inspector-wrappers/console-alert-document-body.html b/ManualTests/inspector-wrappers/console-alert-document-body.html new file mode 100644 index 0000000..a177834 --- /dev/null +++ b/ManualTests/inspector-wrappers/console-alert-document-body.html 
@@ -0,0 +1,14 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.alert = function(msg) { + msg.titleInfo = doAttack;  + return msg; +} +</script> +</head> +<body> +<script>instructions({console: true, trigger: "alert(document.body)"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/console-alert-object.html b/ManualTests/inspector-wrappers/console-alert-object.html new file mode 100644 index 0000000..5caab2b --- /dev/null +++ b/ManualTests/inspector-wrappers/console-alert-object.html 
@@ -0,0 +1,14 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.alert = function(msg) { + msg.__proto__.toString = doAttack; + return msg; +} +</script> +</head> +<body> +<script>instructions({console: true, trigger: "alert({})"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/console-alert-this.html b/ManualTests/inspector-wrappers/console-alert-this.html new file mode 100644 index 0000000..4b80326 --- /dev/null +++ b/ManualTests/inspector-wrappers/console-alert-this.html 
@@ -0,0 +1,17 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.alert = function(consolePanel) { + var _addMessage = consolePanel.addMessage; + consolePanel.addMessage = function() {  + doAttack(consolePanel.addMessage); + consolePanel.addMessage = _addMessage;  + } +} +</script> +</head> +<body> +<script>instructions({console: true, trigger: "alert(this)"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/console-eval.html b/ManualTests/inspector-wrappers/console-eval.html new file mode 100644 index 0000000..9274cea --- /dev/null +++ b/ManualTests/inspector-wrappers/console-eval.html 
@@ -0,0 +1,11 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.eval = function() { doAttack(eval); } +</script> +</head> +<body> +<script>instructions({console: true, trigger: "something"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/console-str-alert-object.html b/ManualTests/inspector-wrappers/console-str-alert-object.html new file mode 100644 index 0000000..d146663 --- /dev/null +++ b/ManualTests/inspector-wrappers/console-str-alert-object.html 
@@ -0,0 +1,15 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.str = window.expression = "alert({})"; +window.alert = function(msg) { + msg.__proto__.toString = doAttack; + return msg; +} +</script> +</head> +<body> +<script>instructions({console: true, trigger: "something"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/console-str-getter.html b/ManualTests/inspector-wrappers/console-str-getter.html new file mode 100644 index 0000000..31f8907 --- /dev/null +++ b/ManualTests/inspector-wrappers/console-str-getter.html 
@@ -0,0 +1,12 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +window.__defineGetter__("str", doAttack); +window.__defineGetter__("expression", doAttack); +</script> +</head> +<body> +<script>instructions({console: true, trigger: "something"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/inspector-evaluate.html b/ManualTests/inspector-wrappers/inspector-evaluate.html new file mode 100644 index 0000000..cc00c3b --- /dev/null +++ b/ManualTests/inspector-wrappers/inspector-evaluate.html 
@@ -0,0 +1,11 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +<script> +document.evaluate = doAttack; +</script> +</head> +<body> +<script>instructions({trigger: "Type something into the search box"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/inspector-hasAttributes.html b/ManualTests/inspector-wrappers/inspector-hasAttributes.html new file mode 100644 index 0000000..1fdf51a --- /dev/null +++ b/ManualTests/inspector-wrappers/inspector-hasAttributes.html 
@@ -0,0 +1,18 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +</head> +<body> +<script>instructions({trigger: "Collapse and expand the &lt;body/&gt; tag"});</script> +<script> + _hasAttributes = document.body.hasAttributes; + attackfunc = function() {  + try { doAttack(); } catch(ex) { } + return _hasAttributes.call(this); + } + document.body.firstChild.hasAttributes = attackfunc; + document.body.hasAttributes = attackfunc; + document.body.parentNode.hasAttributes = attackfunc; +</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/inspector-treeElementIdentifier.html b/ManualTests/inspector-wrappers/inspector-treeElementIdentifier.html new file mode 100644 index 0000000..288edc7 --- /dev/null +++ b/ManualTests/inspector-wrappers/inspector-treeElementIdentifier.html 
@@ -0,0 +1,17 @@ +<html> +<head> +<script src="inspector-wrappers-test-utils.js"></script> +</head> +<body> +<script> + document.body.__defineGetter__("__treeElementIdentifier", function() { + try { doAttack(); } catch(ex) { } + return this.___treeElementIdentifier; + }); + document.body.__defineSetter__("__treeElementIdentifier", function(val) { + this.___treeElementIdentifier = val; + }); +</script> +<script>instructions({trigger: "Collapse and expand the &lt;body/&gt; tag"});</script> +</body> +</html> 
diff --git a/ManualTests/inspector-wrappers/inspector-wrappers-test-utils.js b/ManualTests/inspector-wrappers/inspector-wrappers-test-utils.js new file mode 100644 index 0000000..2666167 --- /dev/null +++ b/ManualTests/inspector-wrappers/inspector-wrappers-test-utils.js 
@@ -0,0 +1,46 @@ +var truealert = window.alert; // we overwrite window.alert sometimes + +// Walk up the caller chain and try to find a reference to the Inspector's window +function doAttack() { + var obj = doAttack.caller; + for (var i = 0;  + i < 1000 && (obj.arguments.length == 0 || !obj.arguments[0].target); + i++) { + obj = obj.caller; + } + if (i == 1000) return; + var win = obj.arguments[0].target.ownerDocument.defaultView; + xhr(win); +} + +function xhr(win) { + var xhr = new win.XMLHttpRequest(); + var url = prompt("Test failed. To prove it, I'm going " + + "to make a cross-domain XMLHttpRequest. Where " + + "would you like me to send it?\n\nHint: You can " + + "also try a file:// URL.", "http://www.example.com/"); + xhr.open("GET", url, false); + xhr.send(); + truealert("Result:\n\n" + xhr.responseText); +} + +function instructions(params) { + var str = "<p>This test tries to make a cross-domain XMLHttpRequest to " + + "check whether JavaScript object wrappers are working (bug 16837, bug 16011).</p>" + + "<p>View this page from an http:// URL to ensure that it's in a different " + + "origin from the Inspector.</p>" + + "<p>Instructions:</p>" + + "<ol>" +  + "<li>Right click the box" +  + "<img id=logo src='../resources/webkit-background.png'" +  + "style='border: 1px solid black; display: block; margin: 1em;'>" +  + "<li>Choose \"Inspect Element\" from the context menu"; + if (params.console) { + str += "<li>Select the Console"; + str += "<li>Type " + params.trigger + " into the console and hit Enter"; + } else { + str += "<li>" + params.trigger; + } + str += "<li>If the test failed, a prompt will appear.</ol>"; + document.write(str); +} 
diff --git a/ManualTests/inspector/bp-in-named-eval-after-reload.html b/ManualTests/inspector/bp-in-named-eval-after-reload.html new file mode 100644 index 0000000..4612cd6 --- /dev/null +++ b/ManualTests/inspector/bp-in-named-eval-after-reload.html 
@@ -0,0 +1,65 @@ +<style>code{background-color: #ffc;}</style> +<p><b>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=31375">Bug 31375</a> - Web Inspector: breakpoints in named evals are not restored after a reload</b> + +<ul> +<li><p>open this page with Web Inspector +<li><p>switch to the Scripts panel, enabling debug if required +<li><p>the available scripts in the select element should be: +<ul> +<li>(program): f1.js +<li>(program): f2.js +<li>bp-in-named-eval-after-reload.html +</ul> +<li><p>In <code>(program) f1.js</code>, set a breakpoint on the first +executable line of the function <code>f1()</code>, the invocation of <code>doNothing()</code>. +<li><p>In <code>(program) f2.js</code>, set a breakpoint on the first +executable line of the function <code>f2()</code>, the invocation of <code>doNothing()</code>. +<li><p>click this button: <input id=button type=button value="click me"> +<li><p>debugger should stop in the <code>f1()</code> function. +<li><p>resume the debugger +<li><p>debugger should stop in the <code>f2()</code> function (the function in <code>(program) f2.js</code>) +<li><p>resume the debugger +<li><p>switch to the web page, reload the web page, switch back to web inspector +<li><p>in the breakpoints sidebar panel, click on the two breakpoints listed +and the source for those functions should be shown in the source panel, and +the previous breakpoint markers should be visible +<li><p>click the "click me" button above, again +<li><p>debugger should stop in the <code>f1()</code> function. +<li><p>resume the debugger +<li><p>debugger should stop in the <code>f2()</code> function. +<li><p>resume the debugger +</ul> + +<p>Note that without the fix in <a href="https://bugs.webkit.org/show_bug.cgi?id=31375">Bug 31375</a>, +the breakpoints won't work after reloading the page. + +<script> + +function doNothing() { /* allows multi-line functions, easier to debug */ }; + +eval([ + "function f1() {", + " doNothing();", + " console.log(new Date() + ': f1() called');", + "}", + "//@sourceURL=f1.js" +].join("\n")); + +f2 = Function([ + "", + " doNothing();", + " console.log(new Date() + ': f2() called');", + "//@sourceURL=f2.js" +].join("\n")); + +var button = document.getElementById("button"); + +button.addEventListener("click", clickHandler, false); + +function clickHandler() { + f1(); + f2(); +} + +</script> +<!-- End --> 
diff --git a/ManualTests/inspector/command-line-api.html b/ManualTests/inspector/command-line-api.html new file mode 100644 index 0000000..8b9a153 --- /dev/null +++ b/ManualTests/inspector/command-line-api.html 
@@ -0,0 +1,6 @@ +<script type="text/javascript" charset="utf-8"> + var $ = function() { console.log("OK") }; +</script> + +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=20385">Bug 20385: Firebug command line extensions interfere with existing objects</a>.</p> +<p>To test, execute "$()" in the Inspector's Console. Also trying setting $.</p> 
diff --git a/ManualTests/inspector/console-assert.html b/ManualTests/inspector/console-assert.html new file mode 100644 index 0000000..df2c4cc --- /dev/null +++ b/ManualTests/inspector/console-assert.html 
@@ -0,0 +1,37 @@ +<script> + function createClickHandler(result, str) { + return function() { + console.assert(result, "%s", str); + } + } + + function load() { + var tests = [ + "", + "false", + "null", + "document.body", + "!document.body", + "true" + ]; + + for (var i = 0; i < tests.length; ++i) { + var test = tests[i]; + var result; + try { + result = eval(test); + } catch(e) { + result = false; + } + var button = document.createElement("button"); + button.innerText = "console.assert(" + test + "): should" + (result ? " not" : "") + " assert"; + button.onclick = createClickHandler(result, test); + var p = document.createElement("p"); + p.appendChild(button); + document.body.appendChild(p); + } + } +</script> +<body onload="load()"> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19134">Bug 19134: Inspector should support console.assert</a>.</p> +<p>To test, click the buttons below and look at the Inspector's Console.</p> 
diff --git a/ManualTests/inspector/console-call-line-numbers.html b/ManualTests/inspector/console-call-line-numbers.html new file mode 100644 index 0000000..ae831c5 --- /dev/null +++ b/ManualTests/inspector/console-call-line-numbers.html 
@@ -0,0 +1,14 @@ +<script> + console.info("Test console.info"); + console.log("Test console.log"); + console.warn("Test console.warn"); + console.error("Test console.error"); + console.time("Test console.time"); + console.timeEnd("Test console.time"); + console.count("Test console.count"); + console.assert(false, "Test console.assert"); +</script> +<script src="resources/script-console-calls.js"></script> +<body> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=17234">Bug 17234: Inspector should link console.{log,warn,info,error} back to call site</a>.</p> +<p>To test, open the Inspector's Console and verify that all console messages have correct resource URLs and line numbers. Also verify that errors and warnings show up inline as bubbles in the resource source view.</p> 
diff --git a/ManualTests/inspector/console-dir.html b/ManualTests/inspector/console-dir.html new file mode 100644 index 0000000..90f389d --- /dev/null +++ b/ManualTests/inspector/console-dir.html 
@@ -0,0 +1,31 @@ +<body> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=24329">Bug 24329: REGRESSION: console.dirxml() Console API broken</a>.</p> +<p>To test, open the Inspector's Console and verify that all console messages have the correct output.</p> +</body> +<script> + console.log("Testing console.dir:"); + console.dir(undefined); + console.dir(123); + console.dir(null); + console.dir({}); + console.dir({test: 1, test1:{apple: "orange"}}); + console.dir("Test"); + console.dir(document); + console.dir(document.body); + + console.log("\nTesting console.dirxml:"); + console.dirxml(undefined); + console.dirxml(123); + console.dirxml(null); + console.dirxml({}); + console.dirxml({test: 1, test1:{apple: "orange"}}); + console.dirxml("Test"); + console.dirxml(document); + console.dirxml(document.body); + + console.log("\nTesting console.log's %o and %O formatters:"); + console.log("%o %O", document.body, document.body); + console.log("%o %O", undefined, undefined); + console.log("%o %O", 123, 123); + console.log("%o %O", null, null); +</script> 
diff --git a/ManualTests/inspector/console-log-formatting.html b/ManualTests/inspector/console-log-formatting.html new file mode 100644 index 0000000..d59ebc9 --- /dev/null +++ b/ManualTests/inspector/console-log-formatting.html 
@@ -0,0 +1,68 @@ +<script> + var s = "this is a string"; + var i = 5; + var ni = -5; + var f = 3.14159; + var o = { prop1: 1, prop2: 2 }; + var specifiers = { + s: "string", + i: "integer", + d: "integer", + f: "float", + "0.3f": "float with precision", + o: "object", + z: "unsupported", + }; + + function test(args) { + var functions = ["log", "debug"]; + for (var i = 0; i < functions.length; ++i) { + console.info("console." + functions[i] + "(%s)", args); + try { + eval("console." + functions[i] + "(" + args + ")"); + } catch (e) { + console.error(e); + } + } + } + + function testAllSpecifiers(value, description) { + for (var specifier in specifiers) + test("'Format " + description + " as " + specifiers[specifier] + ": %" + specifier + "', " + value + ""); + } + + function runTests() { + var values = [ + { value: "window.noSuchVariable", description: "undefined" }, + { value: "s", description: "string" }, + { value: "i", description: "positive integer" }, + { value: "ni", description: "negative integer" }, + { value: "f", description: "float" }, + { value: "o", description: "object" }, + { value: "document.body", description: "body" }, + { value: "/test/", description: "RegExp" }, + { value: "true", description: "boolean" }, + { value: "null", description: "null" }, + ]; + + for (var i = 0; i < values.length; ++i) + testAllSpecifiers(values[i].value, values[i].description); + + var tests = [ + "'simple test'", + "'multiple', 'parameters', 'should', 'be', 'concatenated'", + "document", + "document, document.body, window, window.location", + "document, document.body, 'hello', 'goodbye', window.location", + "'Format string with fewer specifiers than parameters: %o %i %f', document.body, i, f, ni, o", + "'Format string with more specifiers than parameters: %o %i %f %i %o', document.body, i, f", + ]; + + for (var i = 0; i < tests.length; ++i) + test(tests[i]); + + } +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=17228">Bug 17228: console.{log,warn,info,error} should support format strings, variable arguments</a>.</p> +<p>Open the Inspector (right-click and choose "Inspect Element"), then click the "Run Tests" button.</p> +<button onclick="runTests()">Run Tests</button> 
diff --git a/ManualTests/inspector/console-time.html b/ManualTests/inspector/console-time.html new file mode 100644 index 0000000..6c24373 --- /dev/null +++ b/ManualTests/inspector/console-time.html 
@@ -0,0 +1,33 @@ +<script> +function test() { + // Test 1: call timeEnd before time + console.log(">>>console.timeEnd(\"1\")"); + console.timeEnd("1"); + // Test 2: call time two times before timeEnd + console.log(">>>console.time(\"2\")"); + console.time("2"); + setTimeout(function() { + console.log(">>>console.time(\"2\")"); + console.time("2"); + console.log(">>>console.timeEnd(\"2\")"); + console.timeEnd("2"); + console.log("2: If it says ~1000ms the first time is not overwritten."); + }, 1000); + // Test 3: call timeEnd two times + console.log(">>>console.time(\"3\")"); + console.time("3"); + console.log(">>>console.timeEnd(\"3\")"); + console.timeEnd("3"); + console.log(">>>console.timeEnd(\"3\")"); + console.timeEnd("3"); + // Test 4: call time/timeEnd without title parameter + console.log(">>>console.time()"); + console.time(); + console.log(">>>console.timeEnd()"); + console.timeEnd(); +}; + +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19159">Bug 19159: Inspector should support console.time/console.timeEnd</a>.</p> +<p>Open the Inspector (right-click and choose "Inspect Element"), then click the "Run Tests" button.</p> +<button onclick="test()">Run Tests</button> \ No newline at end of file 
diff --git a/ManualTests/inspector/debugger-execution-while-paused.html b/ManualTests/inspector/debugger-execution-while-paused.html new file mode 100644 index 0000000..67446d4 --- /dev/null +++ b/ManualTests/inspector/debugger-execution-while-paused.html 
@@ -0,0 +1,15 @@ +<script> +function stepOne() +{ + var x = 1; +} + +function stepTwo() +{ + alert("Test failed. The second button event still fired."); +} +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=20284">Bug 20284: JavaScript can be executed even though debugger is running and at a break point</a>.</p> +<p>To test, open the Inspector and start a debugging session. Set a break point inside the stepOne() function. Now click the Step One button in the page. The breakpoint should be hit. While paused at the breakpoint click on the Step Two button. You should not see an alert dialog.</p> +<button onclick="stepOne()">Step One</button><br><br> +<button onclick="stepTwo()">Step Two</button><br><br> 
diff --git a/ManualTests/inspector/debugger-pause-during-load.html b/ManualTests/inspector/debugger-pause-during-load.html new file mode 100644 index 0000000..631cafc --- /dev/null +++ b/ManualTests/inspector/debugger-pause-during-load.html 
@@ -0,0 +1,5 @@ +<script> +debugger; // You should see this code and execution line in the Scripts panel. +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19053">Bug 19053: Source code not visible when script is paused before onload fires</a>.</p> +<p>To test, open the Inspector and start a debugging session. You should see this file and execution line in the Scripts panel.</p> 
diff --git a/ManualTests/inspector/debugger-pause-on-else-statements.html b/ManualTests/inspector/debugger-pause-on-else-statements.html new file mode 100644 index 0000000..424fb7e --- /dev/null +++ b/ManualTests/inspector/debugger-pause-on-else-statements.html 
@@ -0,0 +1,18 @@ +<script> +function test() +{ + debugger; +} + +if (false) + debugger; // This should not be hit. +else + test(); +</script> + +Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=21944">Bug 21944: Can't set a breakpoint on the statement after a single line "else"</a>. +<br><br> +Start a debugging session in the Web Inspector and open this file. When the debugger breaks, select the (program) node +in the call stack, you should see the execution line on the call to test(). +<br><br> +Also set a breakpoint on the call to test(), and reload. It should break before the test() function is called. 
diff --git a/ManualTests/inspector/debugger-pause-on-for-in-statements.html b/ManualTests/inspector/debugger-pause-on-for-in-statements.html new file mode 100644 index 0000000..c0c24e0 --- /dev/null +++ b/ManualTests/inspector/debugger-pause-on-for-in-statements.html 
@@ -0,0 +1,18 @@ +<script> +function test() +{ + debugger; +} + +var object = { test: 1 }; + +for (var property in object) + test(); +</script> + +Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=22004">Bug 22004: Can't set a breakpoint on the statement after a single line "for"</a>. +<br><br> +Start a debugging session in the Web Inspector and open this file. When the debugger breaks, select the (program) node +in the call stack, you should see the execution line on the call to test(). +<br><br> +Also set a breakpoint on the call to test(), and reload. It should break before the test() function is called. 
diff --git a/ManualTests/inspector/debugger-pause-on-for-statements.html b/ManualTests/inspector/debugger-pause-on-for-statements.html new file mode 100644 index 0000000..43a63e2 --- /dev/null +++ b/ManualTests/inspector/debugger-pause-on-for-statements.html 
@@ -0,0 +1,16 @@ +<script> +function test() +{ + debugger; +} + +for (var i = 0; i < 1; ++i) + test(); +</script> + +Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=22004">Bug 22004: Can't set a breakpoint on the statement after a single line "for"</a>. +<br><br> +Start a debugging session in the Web Inspector and open this file. When the debugger breaks, select the (program) node +in the call stack, you should see the execution line on the call to test(). +<br><br> +Also set a breakpoint on the call to test(), and reload. It should break before the test() function is called. 
diff --git a/ManualTests/inspector/debugger-scopes-inspection.html b/ManualTests/inspector/debugger-scopes-inspection.html new file mode 100644 index 0000000..f06b3e7 --- /dev/null +++ b/ManualTests/inspector/debugger-scopes-inspection.html 
@@ -0,0 +1,35 @@ +<script> + +var obj = { + objField: 30 +}; + +function handleLoad(e) { + new C().m(); +} + +function C() { + this.a = 10; + this.timestamp = Date.now(); +} + +C.prototype.m = function() { + this.timestamp = Date.now(); + with (obj) { + debugger; + objField++; + } + var self = this; + setTimeout(function() { + self.m(); + }, 1000); +}; + + +</script> +<body onload="handleLoad(event)"> + +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=34161"> Bug 34161 - Local scope is shown as With scope in scope chain pane </a>.</p> +<p>To test, open the Inspector and start a debugging session. In a second debugger will pause. While paused look at scope chain pane. There should be three scopes: 'With scope' containing objField variable, 'Local scope' with this and self variables and 'Global scope'. All scopes but 'Global' should be expanced. 'Global' scope should be collapsed(it takes too long to expand DOMWindow so we prefer to do it on demand). </p> +</body> + 
diff --git a/ManualTests/inspector/debugger-shortcuts-with-console-opened.html b/ManualTests/inspector/debugger-shortcuts-with-console-opened.html new file mode 100644 index 0000000..df089d5 --- /dev/null +++ b/ManualTests/inspector/debugger-shortcuts-with-console-opened.html 
@@ -0,0 +1,16 @@ +<script> +function testFunction() +{ + showAlert(); +} + +function showAlert() +{ + alert("Test completed."); +} +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=31252">Bug 31252: Web Inspector: Debugger shortcuts (F8, F10, F11) have no effect if the Console view is open</a>.</p> +<p>To test, open the Inspector and start a debugging session. Open the Console view (press Esc or click the "Show console" button in the status bar) and make sure it is focused (the cursor is blinking in the text prompt.) +Set a breakpoint inside testFunction() (on the showAlert() call) and press F8. Now click the Test button in the page. The execution should stop on an HTML line containing <b>onclick="testFunction()"</b>. Press F8. The execution should stop on the breakpoint. +Press F11, F10, F11 sequentially. You should see the "Test completed." alert dialog ONLY after the last keypress.</p> +<button onclick="testFunction()">Test</button><br><br> 
diff --git a/ManualTests/inspector/debugger-status-bar-buttons-state.html b/ManualTests/inspector/debugger-status-bar-buttons-state.html new file mode 100644 index 0000000..31ca3b1 --- /dev/null +++ b/ManualTests/inspector/debugger-status-bar-buttons-state.html 
@@ -0,0 +1,2 @@ +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19173">Bug 19173: Tool tips for Inspector debugger status bar buttons are wrong/missing</a>.</p> +<p>To test, open the Inspector and go to the Scripts panel. Check that the tool tips for the debugger's two status bar buttons make sense when each button is toggled on and off.</p> 
diff --git a/ManualTests/inspector/debugger-step-on-do-while-statements.html b/ManualTests/inspector/debugger-step-on-do-while-statements.html new file mode 100644 index 0000000..190cbf8 --- /dev/null +++ b/ManualTests/inspector/debugger-step-on-do-while-statements.html 
@@ -0,0 +1,29 @@ +<script src="resources/loop-statements.js"></script> +<script>  +function runDoWhile() +{ + /* place breakpoint on next line and click continue */ debugger; + do { + statement(); + increment(); + } while (condition()); +} + +</script> +Start a debugging session in the Web Inspector and open this file. +<br><br> +Before running the tests please perform the following: +Make sure the execution is not paused in the debugger.<br> +Click the button and when the debugger breaks, set a breakpoint on the first line in the loop +(as indicated by the comment), and click continue.<br> +The debugger should stop at the beggining of the loop.<br> +The above actions should be performed before <b>each</b> of the following tests. +<br><br> +<input type="button" value="run do-while" onclick="initialize();runDoWhile()"/> +<br><br> +TEST 1: Click 'continue'. Execution should continue without stopping on the loop breakpoint again.<br> +TEST 2: Click 'Step over'. Debugger should step inside the loop to the next statement line. +'Step over' until the debugger reaches the 'while' line. Click 'Step into' - the debugger should +enter the 'condition' function.<br> +TEST 3: 'Step over' to the end of the loop (and 'while' statement) and step over again. Debugger +should go to the beggining of the loop.<br> 
diff --git a/ManualTests/inspector/debugger-step-on-for-in-statements.html b/ManualTests/inspector/debugger-step-on-for-in-statements.html new file mode 100644 index 0000000..8d6de78 --- /dev/null +++ b/ManualTests/inspector/debugger-step-on-for-in-statements.html 
@@ -0,0 +1,35 @@ +<script> +var myObj = {test : 1}; +function getObject() +{ + return myObj; +} + +function statement() { + ; +} + +function runForIn() +{ + /* place breakpoint on next line and click continue */ debugger; + for (var property in getObject()) + statement(); +} + +</script> +Start a debugging session in the Web Inspector and open this file. +<br><br> +Before running the tests please perform the following: +Make sure the execution is not paused in the debugger.<br> +Click the button and when the debugger breaks, set a breakpoint on the first line in the loop +(as indicated by the comment), and click continue.<br> +The debugger should stop at the beggining of the loop.<br> +The above actions should be performed before <b>each</b> of the following tests. +<br><br> +<input type="button" value="run for-in" onclick="runForIn()"/> +<br><br> +TEST 1: Click 'continue'. Execution should continue without stopping on the loop breakpoint again.<br> +TEST 2: Click 'Step over'. Debugger should step inside the loop to the next statement line.<br> +TEST 3: Click 'Step into'. Debugger should step into 'getObject' function.<br> +TEST 4: 'Step over' to the statement line and then 'Step over' again. Debugger should pause on +the for-in loop again.<br> 
diff --git a/ManualTests/inspector/debugger-step-on-for-statements.html b/ManualTests/inspector/debugger-step-on-for-statements.html new file mode 100644 index 0000000..d3a50c6 --- /dev/null +++ b/ManualTests/inspector/debugger-step-on-for-statements.html 
@@ -0,0 +1,28 @@ +<script src="resources/loop-statements.js"></script> +<script>  +function runFor() +{ + /* place breakpoint on next line and click continue */ debugger; + for (initialize(); condition(); increment()) + statement(); +} +</script> +Start a debugging session in the Web Inspector and open this file. +<br><br> +Before running the tests please perform the following: +Make sure the execution is not paused in the debugger.<br> +Click the button and when the debugger breaks, set a breakpoint on the first line in the loop +(as indicated by the comment), and click continue.<br> +The debugger should stop at the beggining of the loop.<br> +The above actions should be performed before <b>each</b> of the following tests. +<br><br> +<input type="button" value="run for" onclick="runFor()"/> +<br><br> +TEST 1: Click 'continue'. Execution should continue without stopping on the loop breakpoint again.<br> +TEST 2: Click 'Step over'. Debugger should step inside the loop to the next statement line.<br> +TEST 3: Click 'Step into'. Debugger should step into 'initialize' function. Click 'Step into' until +outside of the 'initialize' function - debugger should enter the 'condition' function.<br> +TEST 4: 'Step over' to the statement line and then 'Step over' again. Debugger should pause on +the for loop again. Click 'Step into'. Debugger should step into the 'increment' function. +Click 'Step into' until outside of the 'increment' function - debugger should enter the 'condition' +function.<br> 
diff --git a/ManualTests/inspector/debugger-step-on-while-statements.html b/ManualTests/inspector/debugger-step-on-while-statements.html new file mode 100644 index 0000000..fd077bc --- /dev/null +++ b/ManualTests/inspector/debugger-step-on-while-statements.html 
@@ -0,0 +1,29 @@ +<script src="resources/loop-statements.js"></script> +<script>  +function runWhile() +{ + /* place breakpoint on next line and click continue */ debugger; + while (condition()) { + statement(); + increment(); + } +} + +</script> +Start a debugging session in the Web Inspector and open this file. +<br><br> +Before running the tests please perform the following: +Make sure the execution is not paused in the debugger.<br> +Click the button and when the debugger breaks, set a breakpoint on the first line in the loop +(as indicated by the comment), and click continue.<br> +The debugger should stop at the beggining of the loop.<br> +The above actions should be performed before <b>each</b> of the following tests. +<br><br> +<input type="button" value="run while" onclick="initialize();runWhile()"/> +<br><br> +TEST 1: Click 'continue'. Execution should continue without stopping on the loop breakpoint again.<br> +TEST 2: Click 'Step over'. Debugger should step inside the loop to the next statement line.<br> +TEST 3: Click 'Step into'. Debugger should step into 'condition' function.<br> +TEST 4: 'Step over' the statements until reaching the end of the loop. Debugger should +step over to the beggingin of the while loop again. Click 'Step into'. Debugger should step into +the 'condition' function.<br> 
diff --git a/ManualTests/inspector/debugger-watch-expressions.html b/ManualTests/inspector/debugger-watch-expressions.html new file mode 100644 index 0000000..eb883c9 --- /dev/null +++ b/ManualTests/inspector/debugger-watch-expressions.html 
@@ -0,0 +1,115 @@ +<p>Test for  +<a href="https://bugs.webkit.org/show_bug.cgi?id=27514">Bug 27514 - add support for watched expression</a>. + +<p>To begin test, open web inspector, go the scripts panel  +(enabling script debugging if necccessary), and then click this link: +<a href="javascript:runTest()">[begin test]</a>. + +<p>Perform the following steps, and note the expected results: +  +<ol> +  +<li><p>After clicking the link above, you should now be paused in the body of  +the test method, thanks to the <code>debugger</code> statement. + +<li><p>Add the following expressions to the "Watch Expressions" section of the +Scripts panel sidebar pane: "<code>this</code>", "<code>a</code>",  +"<code>b</code>", "<code>c</code>" and "<code>d</code>". Do <b>NOT</b> enter the quotes. + +<li><p>The values of the expressions as shown in the window should a  +<code>DOMWindow</code> for <code>this</code>, <code>undefined</code> for +the <code>a</code>, <code>b</code>, and <code>c</code> variables, and a  +value of <code>ReferenceError: Can't find variable: d</code> +for the <code>d</code> variable. + +<li><p>Note that the value for <code>d</code> should not change for the life of  +the test, as the variable <code>d</code> is never introduced in the program. + +<li><p>Step through the code, and you'll see the values of <code>a</code>, +<code>b</code>, and <code>c</code> change, as the variables are assigned. +Also note that as the scope changes due to the function invocation, values +will be changed to refer to their current scope. The <code>this</code> +expression will change when the method is invoked on the object constructed by +the test. + +<li><p>Click different stack frames in the Call Stack section to ensure the +expressions change value appropriately as the current stack frame changes. + +<li><p>Drive the debugger through the end of the outermost function, so that +the debugger is no longer in paused state. The values of  +<code>a</code>, <code>b</code>, and <code>c</code> should all be a +ReferenceError like <code>d</code>, since these variables are defined in the +<code>runTest()</code> function, and the expressions are being evaluated against +the global object. + +<li><p>From the console, execute the statement "<code>a = 1</code>". The +watch expressions do not currently refresh, so the value for <code>a</code> +should still be ReferenceError. + +<li><p>Click the "Refresh" button in the Watch Expressions section and the +value for "<code>a</code>" should now be "<code>1</code>". + +<li><p>Close down the browser, start it back up, traverse to a web site, +bring up web inspector, go to the Scripts panel. You should see the same +set of Watch Expressions in the list as you had when you last used web +inspector. + +<li><p>Delete an expression by moving the mouse into the Watch Expression +section, and clicking the X icon which appears to the right of an  +expression (on hover). + +<li><p>Delete an expression by double-clicking anywhere on a top-level line +of a watch expression, and changing the expression to an empty string or  +nothing but white-space. + +<li><p>Modify an entry by double-clicking anywhere on a top-level line +of a watch expression, and changing the expression. + +<li><p>Enter a new expression, "<code>new Date()</code>". The value should be +a toString() version of the date. Repeatedly press the Refresh button to see +the value updated with the current time. + +</ol> + +<script> +function runTest() { +  + // a nested function + function subFunction() { + debugger; + var a = "a in subFunction()"; +  + subSubFunction(); +  + // another nested function + function subSubFunction() { + debugger; + var b = "b in subSubFunction()"; + } + } +  + // a class + function aClass() { + this.x = "xxx"; + this.y = "yyy"; + } +  + aClass.prototype.aMethod = function() { + debugger; + var c = "c in aMethod()"; + } +  + // main logic + debugger; +  + var a = "a in runTest()"; + var b = "b in runTest()"; + var c = "c in runTest()"; +  + subFunction(); +  + var object = new aClass(); + object.aMethod(); +  +} +</script> 
diff --git a/ManualTests/inspector/display-form-data.html b/ManualTests/inspector/display-form-data.html new file mode 100644 index 0000000..48cd817 --- /dev/null +++ b/ManualTests/inspector/display-form-data.html 
@@ -0,0 +1,249 @@ +<html> +<head> +<title>Tests for Bug 22920</title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" > +</head> + +<body> +<p>Tests for  +<ul>  +<li><p><a href="https://bugs.webkit.org/show_bug.cgi?id=22920">Bug 22920: Inspector Request Headers Should Show Data/Variables/Parameters Sent With Request</a> +<li><p><a href="https://bugs.webkit.org/show_bug.cgi?id=28970">Bug 28970: content-type parameters not taken into account when building form-data</a> +</ul> + +<p>To test, open the Inspector on this page, go to the Resources panel, +and select the various resources created by this page in the left column of the +Resources panel. Note that for test-4 ... +test-11, the -sync and -async versions should show the same Form Data, +Request Payload and/or Query String Parameter values. + +<ul> + +<li><p><b>test-1</b>: +<br>no Form Data, Request Payload or Query String Parameters + +<li><p><b>test-2</b>: +<br>Query String Parameters (1): "parm1: abc" + +<li><p><b>test-3</b>: +<br>Query String Parameters (2): "parm1: def" and "parm2: g h i"; +Hovering over either parm should yield a tooltip: +<i>"Double-Click to toggle between URL encoded and decoded formats"</i>. +Double-clicking on either parm should toggle between encoded and decoded +versions of the string. The decoded form is initially displayed. +The encoded form of parm2 is "g%20h+i". + +<li><p><b>test-4</b>: +<br>no Form Data, Request Payload or Query String Parameters + +<li><p><b>test-5</b>: +<br>Query String Parameters (1): "parm1: abc" + +<li><p><b>test-6</b>: +<br>Query String Parameters (3): "parm1: def" and "parm2: g h i" and "parm3: jj kk ll" + +<li><p><b>test-7</b>: +<br>Request Payload: 3 lines of text data with a very long 2nd line which should wrap + +<li><p><b>test-8</b>: +<br>Request Payload: 3 lines of text data with a very long 2nd line which should wrap + +<li><p><b>test-9</b>: +<br>Request Payload: 3 lines of text data with a very long 2nd line of binary data which should wrap + +<li><p><b>test-10</b>: +<br>Form Data (1): "parm1: abc" + +<li><p><b>test-11</b>: +<br>Form Data (2): "parm1: def" and "parm2: g h i" + +<li><p><b>test-12</b>: +<br>Query String Parameters (2): "parm1: abc" and "parm2: d e f" +<br>Form Data (2): "parm1: ghi" and "parm2: j k l" + +<li><p><b>test-13</b>: +<br>Query String Parameters (2): "parm1: &auml;bc" and "parm2: d &#x11B; f" +<br>Form Data (2): "parm1: ghi" and "parm2: j k l" +<p>Note that you should view the encoded values of the query string parameters +by double-clicking on one of the parameters. The values should be: +<pre> +parm1: %C3%A4bc +parm2: d%20%C4%9B+f +</pre> + +<li><p><b>test-14</b>: +<br>Same results as for test-13, a slightly different but compatible Content-Type +is used for the form data. + +<li><p><b>test-15</b>: +<br>Query String Parameters (2): "parm1: % (unable to decode value)" and "parm2: % (unable to decode value)", +with the parenthesized part in red. +<br>Form Data (2): "parm1: % (unable to decode value)" and "parm2: % (unable to decode value)", +with the parenthesized part in red. +<p>Note that you should view the encoded values of the query string parameters +by double-clicking on one of the parameters. The values for all four parameters should be "%". + +<li><p><b>test-form</b>: +<br>For this test, invoke the form at the bottom of the page +by pressing the submit button. The Resources panel should have a "test-form" +resource, with the following data: +<p>Form Data (2): "field1: value &auml;;b;c" and "field2:value d;&#x11B;;f" +<p>Note that you should view the encoded values of the query string parameters +by double-clicking on one of the parameters. The values should be: +<pre> +field1: value+%C3%A4%3Bb%3Bc +field2: value+d%3B%C4%9B%3Bf</pre> +</ul> + +<p><b>test-form</b> +<form id="form" action="http://example.org/test-form" method="post" enctype="application/x-www-form-urlencoded"> +<span style="font-size:200%">field1:</span> <input style="font-size:200%" type="text" name="field1" value="value &auml;;b;c"><br> +<span style="font-size:200%">field2:</span> <input style="font-size:200%" type="text" name="field2" value="value d;&#x11B;;f"><br> +<input type="submit"> +</form> + +<div style="display:none"> + +<img src="http://example.org/test-1"> +<img src="http://example.org/test-2?parm1=abc"> +<img src="http://example.org/test-3?parm1=def&amp;parm2=g%20h+i"> + +</div> + +<hr> + +<p><b>NLS sample info</b> + +<pre> +<span style="font-size:300%">&auml;</span> - LATIN SMALL LETTER A WITH DIAERESIS +Unicode: 0x00E4 == 228  +UTF8: C3 A4  +HTML: &amp;auml; + +<span style="font-size:300%">&#x11B;</span> - LATIN SMALL LETTER E WITH CARON +Unicode: 0x011B == 283  +UTF8: C4 9B +HTML: &amp;#x11B; +</pre> +  +<script> + +function getReadyState(num) { + switch(num) { + case 0: return "uninitialized"; + case 1: return "loading"; + case 2: return "loaded"; + case 3: return "interactive"; + case 4: return "complete"; + default: return "unknown: " + num; + } +} + +function getProcessXHR(request) { + return function() { + if (true) return; + var rs = getReadyState(request.readyState); + console.log("ready state change for " + request.url); + console.log(" ready state: " + rs); + console.log(" response text: " + request.responseText); + if (request.readyState == 4) { + console.log(" status: " + request.status); + console.log(" status text: " + request.statusText); + } + } +} + +function sendXHR(url, method, headers, body) { + if (!method) method = "GET"; + if (!headers) headers = []; + if (!body) body=""; + + // copy headers + var headersNew = []; + for (var i=0; i<headers.length; i++) { + headersNew.push(headers[i]); + } + headers = headersNew; + + if (body != "") { + headers.push(["Content-Length", body.length.toString()]); + } + + // sync + var req = new XMLHttpRequest(); + + req.url = url.replace("^","-sync"); + req.onreadystatechange = getProcessXHR(req); + req.open(method, req.url, false); + + for (var i=0; i<headers.length; i++) { + req.setRequestHeader(headers[i][0], headers[i][1]); + } + + req.send(body); + + // async + var req = new XMLHttpRequest(); + + req.url = url.replace("^","-async"); + req.onreadystatechange = getProcessXHR(req); + req.open(method, req.url, true); + + for (var i=0; i<headers.length; i++) { + req.setRequestHeader(headers[i][0], headers[i][1]); + } + + req.send(body); +} + +var headersPlain = [ + ["Content-Type", "text/plain"] +]; + +var headersForm = [ + ["Content-Type", "application/x-www-form-urlencoded"] +]; + +var headersFormExtra1 = [ + ["Content-Type", "application/x-www-form-urlencoded;something-else=here"] +]; + +var headersFormExtra2 = [ + ["Content-Type", "application/x-www-form-urlencoded ; something-else=here"] +]; + +var headersBinary = [ + ["Content-Type", "application/octet-stream"] +]; + +var longText = "some text with a \n"; +for (var i=0; i<40; i++) { + longText += "very-"; +} +longText += "long\nline in it"; + +var binaryData = "some text with binary data\n"; +for (var i=0; i<256; i++) { + binaryData += String.fromCharCode(i); +} +binaryData += "\nin the middle of it"; + + +sendXHR("http://example.org/test-4^"); +sendXHR("http://example.org/test-5^?parm1=abc"); +sendXHR("http://example.org/test-6^?parm1=def&parm2=g%20h+i&parm3=jj++kk%20%20ll"); + +sendXHR("http://example.org/test-7^", "POST", null, longText); +sendXHR("http://example.org/test-8^", "POST", headersPlain, longText); +sendXHR("http://example.org/test-9^", "POST", headersBinary, binaryData); +sendXHR("http://example.org/test-10^", "POST", headersForm, "parm1=abc"); +sendXHR("http://example.org/test-11^", "POST", headersForm, "parm1=def&parm2=g%20h+i"); +sendXHR("http://example.org/test-12^?parm1=abc&parm2=d%20e+f", "POST", headersForm, "parm1=ghi&parm2=j%20k+l"); +sendXHR("http://example.org/test-13^?parm1=%C3%A4bc&parm2=d%20%C4%9B+f", "POST", headersFormExtra1, "parm1=ghi&parm2=j%20k+l"); +sendXHR("http://example.org/test-14^?parm1=%C3%A4bc&parm2=d%20%C4%9B+f", "POST", headersFormExtra2, "parm1=ghi&parm2=j%20k+l"); +sendXHR("http://example.org/test-15^?parm1=%&parm2=%", "POST", headersForm, "parm1=%&parm2=%"); + +</script> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/inspector/display-sql-null.html b/ManualTests/inspector/display-sql-null.html new file mode 100644 index 0000000..1d1403b --- /dev/null +++ b/ManualTests/inspector/display-sql-null.html 
@@ -0,0 +1,21 @@ +<script> + try { + var db = openDatabase("InspectorTest", "0.1", "Database for Inspector tests", 200000); + db.transaction(function(tx) { + tx.executeSql("CREATE TABLE DisplaySQLNull (test TEXT)", [], function(tx) { + tx.executeSql("INSERT INTO DisplaySQLNull (test) VALUES (NULL)"); + }) + }); + } catch (e) { + } +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=18837">Bug 18837: Database panel fails to display tables if any value is NULL</a>.</p> +<p>To test:</p> +<ol> + <li>Open the Inspector</li> + <li>Go to the Databases panel</li> + <li>Click on the <code>DisplaySQLNull</code> table inside the <code>InspectorTest</code> database</li> +</ol> +<p>If the contents of the table appear (a single row with the value +"<code>null</code>" in the <code>test</code> column), you have passed the +test.</p> 
diff --git a/ManualTests/inspector/display-sql-transaction-error.html b/ManualTests/inspector/display-sql-transaction-error.html new file mode 100644 index 0000000..da2d310 --- /dev/null +++ b/ManualTests/inspector/display-sql-transaction-error.html 
@@ -0,0 +1,24 @@ +<script> + try { + var db = openDatabase("InspectorTest", "0.1", "Database for Inspector tests", 200000); + db.transaction(function(tx) { + tx.executeSql("CREATE TABLE DisplaySQLTransactionError (test TEXT)", []); + }); + } catch (e) { + } +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19438">Bug 19438: Transaction errors are never displayed in database query view</a>.</p> +<p>To test:</p> +<ol> + <li>Open the Inspector</li> + <li>Go to the Databases panel</li> + <li>Click on the <code>InspectorTest</code> database</li> + <li>Enter the following text on the query input line: <code>INSERT INTO DisplaySQLTransactionError (test) VALUES (NULL)</code></li> +</ol> +<p>If the line of text you entered remains and an error line is output below +it, you have passed the test.</p> +<p>If the line of text you entered disappears and no error line is output, you +have failed the test.</p> +<p>If the line of text you entered remains and no error line is output, then +the test has become invalid and needs to be modified to cause the error +callback passed by the Inspector to <code>db.transaction</code> to be called.</p> 
diff --git a/ManualTests/inspector/dom-mutation.html b/ManualTests/inspector/dom-mutation.html new file mode 100644 index 0000000..33e8333 --- /dev/null +++ b/ManualTests/inspector/dom-mutation.html 
@@ -0,0 +1,31 @@ +<script> +function test1() { + document.getElementById("test").src = "resources/mutate-frame.html"; +} + +function test2() { + document.getElementById("test").src = "resources/mutate-frame-2.html"; +} + +var count = 1; +function run() { + var container = document.getElementById("test2"); + var div = document.createElement("div"); + div.textContent = "Testing " + (count++); + container.appendChild(div); + if (count > 10) + container.removeChild(container.firstChild); +} + +setInterval(run, 1000); +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=6590">Bug 6590: Web Inspector shows stale DOM tree if the DOM changes after the inspector has loaded</a>.</p> +<p>To test, open the Inspector and watch the DOM change to match the page. Clicking the buttons will navigate the subframe, and the all the subframe child nodes should change.</p> +<div style="clear: both"> +<button onclick="test1()">Test Frame 1</button> +<button onclick="test2()">Test Frame 2</button> +</div> +<div style="float: left"> +<iframe id="test" src="resources/mutate-frame.html" width="200" height="300"></iframe> +</div> +<div style="float: left; margin-left: 10px;" id="test2"></div> 
diff --git a/ManualTests/inspector/duplicate-resource-urls.html b/ManualTests/inspector/duplicate-resource-urls.html new file mode 100644 index 0000000..7a9be7e --- /dev/null +++ b/ManualTests/inspector/duplicate-resource-urls.html 
@@ -0,0 +1,61 @@ +<html> +<head> +<title>Tests for Bug 30079</title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" > +</head> + +<body> +<p>Tests for  +<ul>  +<li><p><a href="https://bugs.webkit.org/show_bug.cgi?id=30079">Bug 30079: unselectable resources in resource panel</a> +</ul> + +<p>To test, open the Inspector on this page, go to the Resources panel. + +<p>First off, you should be able to actually select each "abc" resource to see +the HTTP info / content. Bug 30079 didn't allow you to select all of these. +  +<p>For each of the "abc" resources open the <b>HTTP Information</b> and  +<b>Request Payload</b> tree elements above the content. One of the resources  +will not have a <b>Request Payload</b>. + +<p>There should be one each of the following resources: +  +<ul> +<li><p>One with a Request Method: GET and no Request Payload +<li><p>One with a Request Method: POST and Request Payload of "123" +<li><p>One with a Request Method: POST and Request Payload of "456" +</ul> + +<p>Another change made by this bug was to change the way the drag/drop of +the resource itself worked. The previous method of handling drag/drop of +the resource was actually causing the unselectability. So the drag/drop +of the resources needs to be tested as well. + +<ul> +<li><p>Select one of the resources. +<li><p>Drag it to an application that can accept text or a link +<li><p>The application should provide some feedback indicating it will accept +the drop, but may not +<li>Drop, and the URL for the resource should be rendered appropriately. +  +<script> + +var xhr; + +xhr = new XMLHttpRequest(); +xhr.open("POST", "http://example.org/abc"); +xhr.send("123"); + +xhr = new XMLHttpRequest(); +xhr.open("POST", "http://example.org/abc"); +xhr.send("456"); + +xhr = new XMLHttpRequest(); +xhr.open("GET", "http://example.org/abc"); +xhr.send(); + +</script> + +</body> +</html> 
diff --git a/ManualTests/inspector/error-warning-count.html b/ManualTests/inspector/error-warning-count.html new file mode 100644 index 0000000..9f6b9c2 --- /dev/null +++ b/ManualTests/inspector/error-warning-count.html 
@@ -0,0 +1,60 @@ +<script> + function clickHandler(errors, warnings) + { + return function() + { + for (var i = 0; i < errors; ++i) + console.error("Error " + (i + 1)); + for (var i = 0; i < warnings; ++i) + console.warn("Warning " + (i + 1)); + } + } + + function loaded() + { + var tests = [ + { errors: 0, warnings: 0 }, + { errors: 1, warnings: 0 }, + { errors: 2, warnings: 0 }, + { errors: 0, warnings: 1 }, + { errors: 0, warnings: 2 }, + { errors: 1, warnings: 1 }, + { errors: 1, warnings: 2 }, + { errors: 2, warnings: 1 }, + { errors: 2, warnings: 2 }, + { errors: 100, warnings: 100 }, + ]; + + for (var i in tests) { + var test = tests[i]; + + var button = document.createElement("button"); + var content = ""; + if (!test.errors && !test.warnings) + content = "(nothing)"; + else { + if (test.errors > 0) + content += test.errors + " error" + (test.errors != 1 ? "s" : ""); + if (test.warnings > 0) { + if (content.length) + content += ", "; + content += test.warnings + " warning" + (test.warnings != 1 ? "s" : "") + } + } + button.innerText = content; + button.onclick = clickHandler(test.errors, test.warnings); + var p = document.createElement("p"); + p.appendChild(button); + document.body.appendChild(p); + } + } +</script> +<body onload="loaded()"> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=18650">Bug 18650: +Errors/warnings in Inspector should be visible outside of Resources</a>.</p> +<p>To test, open the Inspector and click one of the buttons below. You should +see an error and/or warning count in the Inspector's status bar. Clicking on +the error/warning count should open the Console. Hovering over the +error/warning count should show you a tooltip that matches the text in the +button you clicked.</p> +<p>Note: You must reload the page between each button press.</p> 
diff --git a/ManualTests/inspector/errors-with-space in-url.html b/ManualTests/inspector/errors-with-space in-url.html new file mode 100644 index 0000000..07e8ee0 --- /dev/null +++ b/ManualTests/inspector/errors-with-space in-url.html 
@@ -0,0 +1,7 @@ +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19065">Bug 19065: +Resources with a space in their URL don't get error/warning bubbles</a>.</p> +<p>To test, open the Inspector and refresh this page. There should be a red +bubble with the number "1" in it next to the main resource in the Resources +panel. Clicking the button below should change the "1" to a "2".</p> +<p></p></p> +<button onclick="console.error('hi')">click me</button> 
diff --git a/ManualTests/inspector/escape-links.html b/ManualTests/inspector/escape-links.html new file mode 100644 index 0000000..5c5f6c0 --- /dev/null +++ b/ManualTests/inspector/escape-links.html 
@@ -0,0 +1 @@ +<html>  
diff --git a/ManualTests/inspector/forzen-ui-while-paused.html b/ManualTests/inspector/forzen-ui-while-paused.html new file mode 100644 index 0000000..b8d50b0 --- /dev/null +++ b/ManualTests/inspector/forzen-ui-while-paused.html 
@@ -0,0 +1,11 @@ +<script> +function foo() { + var timeout = setTimeout(function() { alert("This should not happen. If you do see this alert, then timers on the page are firing while paused!") }, 0); + debugger; + clearTimeout(timeout); +} + +setTimeout(foo, 100); +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=20042">Bug 20042: UI frozen when the debugger is paused</a>.</p> +<p>Open the inspector and start debugging in the Scripts panel. While paused, try to open the Console. The Console should animate open fully.</p> 
diff --git a/ManualTests/inspector/hidden-evals.html b/ManualTests/inspector/hidden-evals.html new file mode 100644 index 0000000..c507bcd --- /dev/null +++ b/ManualTests/inspector/hidden-evals.html 
@@ -0,0 +1,118 @@ + +<p><b>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=30212">Bug 30212</a> - Each JS execution in console adds extra item into "scripts" combo</b> + +<p>The following manual test creates functions via <tt>eval()</tt> and the  +<tt>Function()</tt> constructor, some functions are named using the  +<code>//@sourceURL=</code> directive, some aren't. Some contain +<tt>debugger</tt> commands, some don't. + +<p>The functions named <tt>f_named_X</tt> are 'named' via the  +<code>//@sourceURL=</code> directive, the ones named <tt>f_unnamed_X</tt> +are not. The 'named' functions should show up in the Scripts select element used  +to select a resource/script to view, the 'unnamed' ones should not. + +<ul> +<li><p>open this page with Web Inspector +<li><p>switch to the Scripts panel, enabling debug if required +<li><p>the available scripts in the select element should be: +<ul> +<li>(program): f_named_1.eval +<li>(program): f_named_2.eval +<li>(program): f_named_3.eval +<li>hidden-evals.html +</ul> +<li><p>click this button: <input id=button type=button value="click me"> +<li><p>debugger should stop in the <code>clickHandler</code> function +<li><p>at this point, start stepping <b>into</b> the code +<li><p>you should be able to step into functions <code>f_unnamed_1()</code> +and <code>f_unnamed_2()</code>. There are no resource/scripts in the  +select element that contain these functions, until you actually are paused  +in them. At that point, entries for these functions will be in the select element, +named: "(program)". After pausing in both functions, there will be two "(program)" +entries. +<li><p>you should be able to use the next/prev buttons (to the left of the select element) +to switch to other resources/scripts that have been opened, including the ones +containing these functions +<li><p>you should be able to click on the functions that exist in the 'hidden' +resources from the Call Stack, and be shown the source; click around the +stack trace entries to verify +<li><p>rather than stepping into the <code>f_named_3()</code> call, press the +resume button +<li><p>the debugger should stop in <code>f_named_3()</code> because of the +<code>debugger</code> command +<li><p>rather than stepping into the <code>f_unnamed_3()</code> call, press the +resume button +<li><p>the debugger should stop in <code>f_unnamed_3()</code> because of the +<code>debugger</code> command. At this point, a third "(program)" entry for +this function is added to the select element. +</ul> + +<script> + +function doNothing() { /* allows multi-line functions, easier to debug */ }; + +eval([ + "function f_named_1() {", + " doNothing();", + " return 'named_1';", + "}", + "//@sourceURL=f_named_1.eval" +].join("\n")); + +eval([ + "function f_unnamed_1() {", + " doNothing();", + " return 'unnamed_1';", + "}" +].join("\n")); + +f_named_2 = Function([ + "", + " doNothing();", + " return 'named_2';", + "//@sourceURL=f_named_2.eval" +].join("\n")); + +f_unnamed_2 = Function([ + "", + " doNothing();", + " return 'unnamed_2';" +].join("\n")); + +f_named_3 = Function([ + "", + " debugger;", + " doNothing();", + " return 'named_3';", + "//@sourceURL=f_named_3.eval" +].join("\n")); + +f_unnamed_3 = Function([ + "", + " debugger;", + " doNothing();", + " return 'unnamed_3';" +].join("\n")); + +var button = document.getElementById("button"); + +button.addEventListener("click", clickHandler, false); + +function clickHandler() { + debugger; + f_named_1(); + f_unnamed_1(); + f_named_2(); + f_unnamed_2(); +  + // press "resume" at this point + console.log("press resume before calling f_named_3()"); + f_named_3(); +  + // press "resume" at this point + console.log("press resume before calling f_unnamed_3()"); + f_unnamed_3(); +} + +</script> +<!-- End --> 
diff --git a/ManualTests/inspector/highlight-nodes.html b/ManualTests/inspector/highlight-nodes.html new file mode 100644 index 0000000..997251a --- /dev/null +++ b/ManualTests/inspector/highlight-nodes.html 
@@ -0,0 +1,23 @@ +<style> +.skewed { + transform:skew(-5deg,-5deg); +} +</style> +<p>This page has basic tests of node highlighting in the inspected page. To tests, load this page, open the inspector and mouseover the nodes in the treeview of the inspector. You should see the highlights happen with the appropriate padding/border/margin/content highlights.</p> +<div style="padding:10px; border: 10px solid; margin: 10px;">padding:10px; border: 10px; margin: 10px;</div> +<div style="padding:10px; border: 10px solid;">padding:10px; border: 10px;</div> +<div style="padding:10px; margin: 10px;">padding:10px; margin: 10px;</div> +<div style="border: 10px solid; margin: 10px;">border: 10px; margin: 10px;</div> +<div style="padding:10px">padding:10px;</div> +<div style="border: 10px solid;">border: 10px;</div> +<div style="margin: 10px;">margin: 10px;</div> +<div>no padding, border, or margin</div> +<div class=skewed style="padding:10px; border: 10px solid; margin: 10px;">transform:skew(-5deg,-5deg); padding:10px; border: 10px; margin: 10px;</div> +<div class=skewed style="padding:10px; border: 10px solid;">transform:skew(-5deg,-5deg); padding:10px; border: 10px;</div> +<div class=skewed style="padding:10px; margin: 10px;">transform:skew(-5deg,-5deg); padding:10px; margin: 10px;</div> +<div class=skewed style="border: 10px solid; margin: 10px;">transform:skew(-5deg,-5deg); border: 10px; margin: 10px;</div> +<div class=skewed style="padding:10px">transform:skew(-5deg,-5deg); padding:10px;</div> +<div class=skewed style="border: 10px solid;">transform:skew(-5deg,-5deg); border: 10px;</div> +<div class=skewed style="margin: 10px;">transform:skew(-5deg,-5deg); margin: 10px;</div> +<div class=skewed >transform:skew(-5deg,-5deg); no padding, border, or margin</div> + 
diff --git a/ManualTests/inspector/highlight-source-line.html b/ManualTests/inspector/highlight-source-line.html new file mode 100644 index 0000000..2520485 --- /dev/null +++ b/ManualTests/inspector/highlight-source-line.html 
@@ -0,0 +1,4 @@ +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19204">Bug 19204: Inspector should highlight source lines when following links to them</a>.</p> +<p>To test, open the Inspector and reload this page. Then open the Inspector's Console and click the link for the markup error. You should see the line containing the error briefly highlighted in the source view.</p> + +<p>This line contains a markup error</i>.</p> 
diff --git a/ManualTests/inspector/multiple-console-messages.html b/ManualTests/inspector/multiple-console-messages.html new file mode 100644 index 0000000..842e6aa --- /dev/null +++ b/ManualTests/inspector/multiple-console-messages.html 
@@ -0,0 +1,86 @@ +<html> +<head> + <script> + function generateErrors(number) + { + for (var i = 0; i < number; ++i) + console.error("This is an error."); + } + + function generateLogs(number) + { + for (var i = 0; i < number; ++i) + console.log("This is a log."); + } + + function generateWarnings(number) + { + for (var i = 0; i < number; ++i) + console.warn("This is a warning."); + } + + function generateInfos(number) + { + for (var i = 0; i < number; ++i) + console.info("This is an info."); + } +  + function startTest() + { + generateErrors(3); + generateLogs(3); + generateWarnings(3); +  + console.group(); + + generateErrors(2); + generateLogs(1); + generateErrors(2); + + generateLogs(2); + generateWarnings(1); + generateLogs(2); + + generateWarnings(2); + generateErrors(1); + generateWarnings(2); +  + console.groupEnd(); + + generateErrors(1); + console.group(); + generateErrors(1); + console.group(); + generateErrors(1); + console.groupEnd(); + generateErrors(1); + console.groupEnd(); + generateErrors(1); +  + console.warn("Same message, different level"); + console.error("Same message, different level"); + console.log("Same message, different level"); + console.info("Same message, different level"); +  + console.log("Variadic message: %s", "message 1"); + console.log("Variadic message: %s", "message 2"); + console.log("Variadic message: %s", "message 3"); + console.log("Variadic message: %s", "message 4"); +  + console.warn("Warning and error on same line."); console.error("Warning and error on same line."); console.warn("Warning and error on same line."); console.error("Warning and error on same line."); +  + } + </script> +</head> +<body onload="startTest()"> +This test generates warnings, errors, and logs to test the grouping of repeated +messages in the Web Inspector. To check this test open the Web Inspector and see +that there are never any repeated messages that don't have a number next to them. +<br> +<br> +<input type="button" onclick="generateErrors(1)" value="Put Error in Console"></input> +<br> +<input type="button" onclick="generateLogs(1)" value="Put Log in Console"></input> +<br> +<input type="button" onclick="generateWarnings(1)" value="Put Warning in Console"></input> +</body> 
diff --git a/ManualTests/inspector/named-evals.html b/ManualTests/inspector/named-evals.html new file mode 100644 index 0000000..0c52531 --- /dev/null +++ b/ManualTests/inspector/named-evals.html 
@@ -0,0 +1,72 @@ +<html> +<head> +<script> + +function log(message) { + console.log(message) +} + +var funcBody = "(){\n" +  +" var thisFunc = arguments.callee;\n" + +" if (!thisFunc.name) thisFunc.displayName = 'f%';\n" +  +" log(thisFunc.name || thisFunc.displayName);\n" + +"}"; + +var funcs = []; +var patterns = [ + // proper use of @sourceURL comment + "//@sourceURL=f%.js\nfuncs.push(function" + funcBody + ")", + "//@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", + " //@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", + "// @sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", + "//@ sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", + "//@sourceURL =f%.js\nfuncs.push(function f%" + funcBody + ")", + "//@sourceURL= f%.js\nfuncs.push(function f%" + funcBody + ")", + "//@sourceURL=f%.js \nfuncs.push(function f%" + funcBody + ")", + " // @ sourceURL = f%.js \nfuncs.push(function f%" + funcBody + ")", + "//@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ");\n//@sourceURL=should-not-see\n", + "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js\n", + "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js \n", + "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js", +  + // improper or non-existant use of @sourceURL comment + "funcs.push(function f%" + funcBody + ")", + "//@sourceurl=f%.js\nfuncs.push(function f%" + funcBody + ")", + "//sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", + "/*@sourceURL=f%.js*/\nfuncs.push(function f%" + funcBody + ")", + "//\nsourceURL='f%.js';\nfuncs.push(function f%" + funcBody + ")", + "//@sourceURL=\nfuncs.push(function" + funcBody + ")", +]; + + +for (var i=0; i<patterns.length; i++) { + eval(patterns[i].replace(/%/g, i)); +} + +</script> +</head> + +<body> +<p>This page's JavaScript calls functions from named eval()'s. +  +<p>Used to test <a href="https://bugs.webkit.org/show_bug.cgi?id=25475">https://bugs.webkit.org/show_bug.cgi?id=25475</a> + +<p>Load the Web Inspector and look at +the script's panel, and the script list drop-down control.  +You should see entries for scripts named  +<tt>"(program):f0.js"</tt> through <tt>"(program):f12.js"</tt>. The entries were named +via proper use of the <tt>//@sourceURL</tt> comment. There will also be entries +named <tt>"(program)"</tt> for source that does not properly use, or use at all, +the <tt>//@sourceURL</tt> comment. + +<p>Now, set a breakpoint in the body of the <tt>"f0"</tt> function in the +<tt>"(program):f0.js"</tt> script. Then click this button: + +<p><input type="button" value="run" onclick="funcs[0]()"> + +<p>When stopped at the breakpoint, the entry for the function in the +call stack control should the name of the script, <tt>"(program):f0.js"</tt>, +beside the function name <tt>"f0"</tt>. Note the function name for  +<tt>f0</tt> is set with the new <tt>"displayName"</tt> property. +</body> +</html> 
diff --git a/ManualTests/inspector/profiler-test-call.html b/ManualTests/inspector/profiler-test-call.html new file mode 100644 index 0000000..572a2e9 --- /dev/null +++ b/ManualTests/inspector/profiler-test-call.html 
@@ -0,0 +1,35 @@ +<html> +<head> +<script src="resources/profiler-test-JS-resources.js"></script> +<script> +console.profile("Using the call() method"); +function startTest() +{ + var myObject = new fakeObject(1, 2); + endTest(); +} + +function fakeObject (x, y) +{ + this.x = x; + fakeInteriorFunction.call(this, y); +} + +function fakeInteriorFunction(y) +{ + this.y = y; +} + +</script> +</head> + +<body onload="startTest()"> +This page's JavaScript has a call to call() in it. +<br> +<br> +To use this test, load it in the browser then load the WebInspector and look at +the profile. In the profile there should be a call to fakeObject() with call() as +its child and a fakeInteriorFunction() as call()'s child. +<div id="output"></div> +</body> +</html> 
diff --git a/ManualTests/inspector/profiler-test-many-calls-in-the-same-scope.html b/ManualTests/inspector/profiler-test-many-calls-in-the-same-scope.html new file mode 100644 index 0000000..da5be42 --- /dev/null +++ b/ManualTests/inspector/profiler-test-many-calls-in-the-same-scope.html 
@@ -0,0 +1,42 @@ +<html> +<head> +<script src="resources/profiler-test-JS-resources.js"></script> +<script> +console.profile("Many Calls In The Same Scope"); +function startTest() +{ + insertNewText(); + insertGivenText("This was a triumph."); + arrayOperatorFunction(7); + intermediaryFunction(); + anonymousFunction(); + end() + endT(); + endT(); + endTest(); +} + +function end() +{ + var x = 0; +} + +function endT() +{ + var y = 1; +} + +</script> +</head> + +<body onload="startTest()"> +This page's JavaScript has many function calls in the same scope. +<br> +<br> +To use this test, load it in the browser then load the WebInspector and look at +the profile. In the profile many functions should be the children of startTest. +Use the sorting capabilites to make sure the similarly named functions are sorted +correctly. +<div id="output"></div> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/inspector/remember-last-script.html b/ManualTests/inspector/remember-last-script.html new file mode 100644 index 0000000..52e7f02 --- /dev/null +++ b/ManualTests/inspector/remember-last-script.html 
@@ -0,0 +1,42 @@ +<style>code{background-color: #ffc;}</style> +<p><b>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=27552">Bug 27552</a> - remember last script displayed in Scripts panel</b> + +<ul> +<li><p>open this page with Web Inspector, switch to the <b>Scripts</b> panel, enabling debug if required +<li><p>the available scripts in the select element should be: + <ul> + <li><b>(program): f1.js</b> + <li><b>remember-last-script.html</b> + </ul> +<li><p>select <b>(program): f1.js</b> so the source is available +<li><p>switch to the <b>Resources</b> panel +<li><p>close Web Inspector +<li><p>Repeat the following several times. Each time, <b>(program): f1.js</b> +should be the selected script: + <ul> + <li>open Web Inspector, switch to the <b>Scripts</b> panel, then close Web Inspector + </ul> +<li><p>open Web Inspector, switch to the <b>Scripts</b> panel +<li><p>select <b>remember-last-script.html</b> so the source is available +<li><p>Repeat the following several times. Each time, <b>remember-last-script.html</b> +should be the selected script: + <ul> + <li>open Web Inspector, switch to the <b>Scripts</b> panel, then close Web Inspector + </ul> +</ul>  + +<script> + +f1 = Function([ + "", + " doNothing();", + "//@sourceURL=f1.js" +].join("\n")); + +function doNothing() { /* allows multi-line functions, easier to debug */ }; + +doNothing(); +f1(); + +</script> +<!-- End --> 
diff --git a/ManualTests/inspector/resources/loop-statements.js b/ManualTests/inspector/resources/loop-statements.js new file mode 100644 index 0000000..cbb4e0d --- /dev/null +++ b/ManualTests/inspector/resources/loop-statements.js 
@@ -0,0 +1,22 @@ +var i; +var a; + +function initialize() +{ + i = false; +} + +function condition() +{ + return !i; +} + +function increment() +{ + i = !i; +} + +function statement() +{ + a = i; +} 
diff --git a/ManualTests/inspector/resources/mutate-frame-2.html b/ManualTests/inspector/resources/mutate-frame-2.html new file mode 100644 index 0000000..9d413b9 --- /dev/null +++ b/ManualTests/inspector/resources/mutate-frame-2.html 
@@ -0,0 +1,12 @@ +<script> +var count = 1; +function run() { + var div = document.createElement("div"); + div.textContent = "Testing " + (count++); + document.body.appendChild(div); + if (count > 10) + document.body.removeChild(document.body.firstChild); +} + +setInterval(run, 1000); +</script> 
diff --git a/ManualTests/inspector/resources/mutate-frame.html b/ManualTests/inspector/resources/mutate-frame.html new file mode 100644 index 0000000..08fc656 --- /dev/null +++ b/ManualTests/inspector/resources/mutate-frame.html 
@@ -0,0 +1,10 @@ +<script> +var count = 1; +function run() { + var div = document.createElement("div"); + div.textContent = "Testing " + (count++); + document.body.appendChild(div); +} + +setInterval(run, 1000); +</script> 
diff --git a/ManualTests/inspector/resources/script-console-calls.js b/ManualTests/inspector/resources/script-console-calls.js new file mode 100644 index 0000000..9c7bc35 --- /dev/null +++ b/ManualTests/inspector/resources/script-console-calls.js 
@@ -0,0 +1,8 @@ +console.info("Test console.info"); +console.log("Test console.log"); +console.warn("Test console.warn"); +console.error("Test console.error"); +console.time("Test console.time"); +console.timeEnd("Test console.time"); +console.count("Test console.count"); +console.assert(false, "Test console.assert"); 
diff --git a/ManualTests/inspector/resources/script-error.js b/ManualTests/inspector/resources/script-error.js new file mode 100644 index 0000000..c8be5ea --- /dev/null +++ b/ManualTests/inspector/resources/script-error.js 
@@ -0,0 +1,6 @@ +var test = document.body; +this.will.be.an.error = 1; + +function test() { + return 42; +} 
diff --git a/ManualTests/inspector/returnEvent-crash.html b/ManualTests/inspector/returnEvent-crash.html new file mode 100644 index 0000000..5dd1119 --- /dev/null +++ b/ManualTests/inspector/returnEvent-crash.html 
@@ -0,0 +1,17 @@ +<script> + function test2() { + var y = 6; + y += 3; + return y; + } + + function test() { + var x = 5; + eval("test2()"); + x += 6; + return x; + } +</script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=19038">Bug 19038: Crash in JavaScriptDebugServer::returnEvent when inspecting an attached Inspector</a>.</p> +<p>To test, open and attach the Inspector's debugger, then click the button below. If you don't crash, you have passed the test.</p> +<button onclick="test()">click me</button> 
diff --git a/ManualTests/inspector/styled-error-bubbles-in-scripts.html b/ManualTests/inspector/styled-error-bubbles-in-scripts.html new file mode 100644 index 0000000..0049cef --- /dev/null +++ b/ManualTests/inspector/styled-error-bubbles-in-scripts.html 
@@ -0,0 +1,6 @@ +<script src="resources/script-error.js"></script> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=20345">Bug 19065: +Error bubbles are clobbered when syntax highlighting JavaScript resources</a>.</p> +<p>To test, open the Inspector. There should be a red bubble with the number "1" +in it next to the the only script resource in the Resources panel. Clicking the +resource should show syntax highlighted JavaScript with a red error bubble.</p> 
diff --git a/ManualTests/inspector/webinspector-log.html b/ManualTests/inspector/webinspector-log.html new file mode 100644 index 0000000..4b3cc36 --- /dev/null +++ b/ManualTests/inspector/webinspector-log.html 
@@ -0,0 +1,22 @@ +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=28047">Bug 28047: add utility method to enable logging messages for inspector development</a>.</p> + +<ul> +<li>Open a browser, go to any web page. +<li>Open web inspector +<li>Open the console panel +<li>Open a web inspector on the web inspector +<li>Open that inspector's console panel +<li>In that panel, run the code: +<pre> + WebInspector.console.log("hello, world") +</pre> +</ul> + +<p>Results: +<br>In the original inspector window, there should now be a message +in the console with the text "hello, world". There will be a blue +maginifying glass icon to the left of the message. Run the same  +command again, and you should see the repeat count go to 2. +The message and repeat count are blue. + + 
diff --git a/ManualTests/interrupted-compound-transform.html b/ManualTests/interrupted-compound-transform.html new file mode 100644 index 0000000..dbd5646 --- /dev/null +++ b/ManualTests/interrupted-compound-transform.html 
@@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Interrupted Transitions on Transform Test</title> + <style type="text/css" media="screen"> + #container { + width: 400px; + height: 400px; + margin: 20px; + border: 1px solid black; + perspective: 800; + } + #tester { + width: 300px; + height: 300px; + margin: 50px; + background-color: blue; + -webkit-transition: transform 3s linear; + transform: rotateX(65deg) translateZ(75px) rotateZ(0deg); + transform-style: preserve-3d; + } + #pos1 { + position:absolute; + width: 300px; + height: 300px; + margin: 50px; + border: 2px solid #F00; + transform: rotateX(65deg) translateZ(75px) rotateZ(118deg); + transform-style: preserve-3d; + } + #pos2 { + position:absolute; + width: 300px; + height: 300px; + margin: 50px; + border: 2px solid #0F0; + transform: rotateX(65deg) translateZ(75px) rotateZ(80deg); + transform-style: preserve-3d; + } + </style> + <script type="text/javascript" charset="utf-8"> + function setAngle(index) + { + var tester = document.getElementById('tester'); + tester.style.transform = "rotateX(65deg) translateZ(75px) rotateZ(" + index + "deg)"; + } +  + function runTest() + { + window.setTimeout(function() { + setAngle(240); + }, 0); + + window.setTimeout(function() { + setAngle(80); + }, 1500); + } + window.addEventListener('load', runTest, false); + </script> +</head> +<body> +In this test you should see a blue diamond spinning in the clockwise direction. After 1.5 seconds it should stop +close to the red outlne and then spin counterclockwise. After 3 more seconds it should stop close to the  +position of the green outline.  +(see: <a href="https://bugs.webkit.org/show_bug.cgi?id=26162">https://bugs.webkit.org/show_bug.cgi?id=26162)</a> +<div id="container"> + <div id="pos1"> + </div> + <div id="pos2"> + </div> + <div id="tester"> + </div> +</div> + +</body> +</html> 
diff --git a/ManualTests/invalid-mouse-event.html b/ManualTests/invalid-mouse-event.html new file mode 100644 index 0000000..e76bbe5 --- /dev/null +++ b/ManualTests/invalid-mouse-event.html 
@@ -0,0 +1,23 @@ +<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=8272">bug 8272</a>: +Use of window.open & window.close can cause crash.</p> +<ol> + <li>(Get a dual processor Mac.)</li> + <li>Disable popup blocking in Safari.</li> + <li>Click the Start button.</li> + <li>As the test runs, move the mouse around.</li> + <li>If Safari doesn't crash in a while, interrupt the test by pressing Cmd+W.</li> +</ol> + +<button onclick="window.open('invalid-mouse-event.html?2', '', '');">Start</button> + +<script> + +if (location.search) { + if (location.search == "?1") { + window.opener.location = window.opener.location; + window.close(); + } else { + window.open('invalid-mouse-event.html?1', '', ''); + } +} +</script> 
diff --git a/ManualTests/item-background.html b/ManualTests/item-background.html new file mode 100644 index 0000000..d9d3b07 --- /dev/null +++ b/ManualTests/item-background.html 
@@ -0,0 +1,155 @@ +<style> + div.container { float: left; background-color: #eee; padding: 4px; margin: 4px; } + div.swatch { width: 14px; height: 14px; background-color: white; position: relative; } + div.swatch div { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + select { display: block; margin-left: 14px; margin-bottom: 1px; } + + div.container.white > select, + div.container.white > div.swatch > div + { background-color: white; } + + div.container.black > select, + div.container.black > div.swatch > div + { background-color: black; } + + div.container.initial > select, + div.container.initial > div.swatch > div + { background-color: initial; } + + div.container.semiblue > select, + div.container.semiblue > div.swatch > div + { background-color: rgba(0, 0, 255, 0.5); } + + .solid { background-color: red; } + .reddish { background-color: rgba(255, 0, 0, 0.75); } + .semigreen { background-color: rgba(0, 255, 0, 0.5); } + .darken { background-color: rgba(0, 0, 0, 0.67); } +</style> +<p> + <strong>This test is for Windows only.</strong> + When you pull down each menu, the items&rsquo; background colors should match up with the swatches on the left (except for the hovered item). +</p> +<div class="container white"> + Solid white menu: + <select> + <option>Default (transparent) option</option> + <option class="solid">Solid red option</option> + <option class="reddish">25% transparent red option</option> + <option class="semigreen">50% transparent green option</option> + <option class="darken">33% transparent black option</option> + </select> + <div class="swatch"></div> + <div class="swatch"> + <div> + <div class="solid"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="reddish"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="semigreen"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="darken"></div> + </div> + </div> +</div> +<div class="container black"> + Solid black menu: + <select> + <option>Default (transparent) option</option> + <option class="solid">Solid red option</option> + <option class="reddish">25% transparent red option</option> + <option class="semigreen">50% transparent green option</option> + <option class="darken">33% transparent black option</option> + </select> + <div class="swatch"></div> + <div class="swatch"> + <div> + <div class="solid"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="reddish"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="semigreen"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="darken"></div> + </div> + </div> +</div> +<div class="container initial"> + Transparent menu: + <select> + <option>Default (transparent) option</option> + <option class="solid">Solid red option</option> + <option class="reddish">25% transparent red option</option> + <option class="semigreen">50% transparent green option</option> + <option class="darken">33% transparent black option</option> + </select> + <div class="swatch"></div> + <div class="swatch"> + <div> + <div class="solid"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="reddish"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="semigreen"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="darken"></div> + </div> + </div> +</div> +<div class="container semiblue"> + 50% blue menu: + <select> + <option>Default (transparent) option</option> + <option class="solid">Solid red option</option> + <option class="reddish">25% transparent red option</option> + <option class="semigreen">50% transparent green option</option> + <option class="darken">33% transparent black option</option> + </select> + <div class="swatch"></div> + <div class="swatch"> + <div> + <div class="solid"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="reddish"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="semigreen"></div> + </div> + </div> + <div class="swatch"> + <div> + <div class="darken"></div> + </div> + </div> +</div> 
diff --git a/ManualTests/java-string-object-type.html b/ManualTests/java-string-object-type.html new file mode 100644 index 0000000..ef74626 --- /dev/null +++ b/ManualTests/java-string-object-type.html 
@@ -0,0 +1,24 @@ +<html> +<body onload="test();"> +<script> +function test() +{ + document.getElementById("results").innerHTML =  + "<p>Type of Java String object is: " + typeof(document.getElementById('applet').getString()); +} +</script> + +<p>This test verifies that Java String objects are of the correct type when returned to JavaScript.</p> + +<p>On success, the Java String object will be of type &quot;object&quot;.<br/> +On failure, the type will be &quot;function&quot;.<br/> +See Radar 4212626.</p> + +<div id="results"> +</div> + +<APPLET id="applet" code="StringTypeTest.class" codebase="resources" width="0" height="0"> +</APPLET> + +</body> +</html> 
diff --git a/ManualTests/keep_spelling_markers.html b/ManualTests/keep_spelling_markers.html new file mode 100644 index 0000000..7e1d964 --- /dev/null +++ b/ManualTests/keep_spelling_markers.html 
@@ -0,0 +1,24 @@ +<html><body> +<h4>Test 1 - Check for hang (was bug #4836034)</h4> +<ol> +<li>open this in Blot or Safari</li> +<li>click before the word "One" in the editable text, below</li> +<li>repeatedly type cmd-; to advance to the next misspelling</li> +<li>confirm that you can wrap back to the first misspelling without hanging</li> +</ol> +<h4>Test 2 - Check that markings are retained (was bug #4204892)</h4> +<ol> +<li>turn on Check Spelling as You Type from Edit-&gt;Spelling menu</li> +<li>click on each of the misspelled words in the line at the bottom of this page</li> +<p>&nbsp;&nbsp;(result should be that each misspelled word now has a red squiggly line below it) +<li>control-click on &#147;foor&#148; in that sentence</li> +<li>select a corrected spelling from the popup, e.g.&#147;four&#148;</li> +<li>make sure that no other misspellings lost their red squiggly underline</li> +</ol> +<hr> +<div contenteditable> +One twwo three foor five siz seven +<div></br></div> +<div>eight nine ten</div> +</div> +</body></html> 
diff --git a/ManualTests/keyboard-menukey-event.html b/ManualTests/keyboard-menukey-event.html new file mode 100644 index 0000000..bd2c8e7 --- /dev/null +++ b/ManualTests/keyboard-menukey-event.html 
@@ -0,0 +1,31 @@ +<html lang="en"> + <head> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> + <title>Menu key testing</title> + <script language="javascript" type="text/javascript"> + function log(str) { + var li = document.createElement("li"); + li.appendChild(document.createTextNode(str)); + var results = document.getElementById("results"); + results.appendChild(li); + } + </script> + </head> + <body> + <p> + See bug: <a href="https://bugs.webkit.org/show_bug.cgi?id=30619">30619</a>. + Note: this test is only applicable for Linux and Windows. + </p> + <ol> + <li>Click the text input box below and press Menu key. + The test passes if you see 'PASS' below. + <input type="text" oncontextmenu="log('PASS');" /> + </li> + <li oncontextmenu="log('PASS');">Click or select somewhere + in this text and press Menu key. + The test passes if you see additional 'PASS' below. + </li> + </ol> + <ul id="results"></ul> + </body> +</html> 
diff --git a/ManualTests/keyboard_select_elements_with_same_beginning.html b/ManualTests/keyboard_select_elements_with_same_beginning.html new file mode 100644 index 0000000..8e3c102 --- /dev/null +++ b/ManualTests/keyboard_select_elements_with_same_beginning.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<head> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +<title> +Test select on elements with same beginning letter +</title> +</head> +<body> +See bug:<a href="https://bugs.webkit.org/show_bug.cgi?id=28205">28205</a>. +<p> +Click the drop-down to show selections (not navigate to the selection box). +Type the first letter 'A' to go to the elements start with 'A'. +It should select the first item starts with 'A'. +In windows, Continue typing 'A', it should continue to select the next item starts with 'A'. +<p> +<select name="selOrigin">  + <option value="">Select Station</option>  + <option value="37169_NJCL">Aberdeen Matawan</option>  + <option value="2_ATLC">Absecon</option>  + <option value="3_MNBN">Allendale</option>  + <option value="4_NJCL">Allenhurst</option>  + <option value="12_MNE">Basking Ridge</option>  + <option value="13_NJCL">Bay Head</option>  + <option value="14_BNTN">Bay Street</option>  + <option value="15_NJCL">Belmar</option>  +</select> +</body> +</html> 
diff --git a/ManualTests/keyboard_select_non_english.html b/ManualTests/keyboard_select_non_english.html new file mode 100644 index 0000000..d06ef97 --- /dev/null +++ b/ManualTests/keyboard_select_non_english.html 
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +<title> +Test select non English element +</title> +</head> +<body> +See bug:<a href="https://bugs.webkit.org/show_bug.cgi?id=25899">25899</a>. +<p> +Choose the correct input method. Open the select element then type the first  +letter of one of the elements. The search prefix should be the first non English +letter, not the value of the physical keyboard plus the native non English +letter. For example, set the input method as Hebrew, hit keyboard 'c', the +translated Hebrew character is 'ב'. The search prefix should be 'ב', not "cב". +And the right element should be selected. +<p> + +Hebrew Select: +<select style="direction:rtl"> + <option>אאא</option> + <option>בבב</option> + <option>גגג</option> + <option>דדדד מילה ערוכה מאוד, כדי שיהיה אפשר לראות יישור</option> +</select> + +Russian Select:  +<select> + <option>фисв</option> + <option>уап</option> + <option>ршол</option> + <option>дьт</option> +</select> +</body> +</html> 
diff --git a/ManualTests/korean-input-space.html b/ManualTests/korean-input-space.html new file mode 100644 index 0000000..c8ccf39 --- /dev/null +++ b/ManualTests/korean-input-space.html Binary files differ 
diff --git a/ManualTests/large-size-image-crash.html b/ManualTests/large-size-image-crash.html new file mode 100644 index 0000000..93cafa2 --- /dev/null +++ b/ManualTests/large-size-image-crash.html 
@@ -0,0 +1,6 @@ +<html> + <body> + Displaying the animated GIF below should not result in memory corruption. + <img src="resources/large-size-image-crash.gif"> + </body> +</html> 
diff --git a/ManualTests/layoutroot_detach.xml b/ManualTests/layoutroot_detach.xml new file mode 100644 index 0000000..3a64c01 --- /dev/null +++ b/ManualTests/layoutroot_detach.xml 
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml"> +<body onload="addImg()"> +<style> +.killme { display:none } +</style> +<div style="overflow:hidden; position:absolute; width:150px; height:150px; top:50px; left:0px"> + <div id='parent' style="overflow:hidden; position:absolute; width:150px; height:150px; top:50px; left:0px"> + <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> + <g> + <rect id='rrr' x='0' y='0' width='10' height='10'/> + </g> + </svg> + </div> +</div> +<script> +function boomie() { + document.body.offsetTop; + document.getElementById('rrr').setAttribute('x', '20'); + document.getElementById('parent').className='killme'; +} +function addImg() { + window.setTimeout(function() { + var i = new Image(); + i.src = 'http://www.webkit.org/nosuchfile.png'; + document.body.appendChild(i); + i.onerror = boomie; + }, 15); +} +</script> +</body> +</html> + 
diff --git a/ManualTests/leak-cycle-observer-wrapper.html b/ManualTests/leak-cycle-observer-wrapper.html new file mode 100644 index 0000000..e813f37 --- /dev/null +++ b/ManualTests/leak-cycle-observer-wrapper.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> + +<p> + Tests that reference cycles between the observer and the callback do not + create leaks. +</p> + +<script> + if (window.testRunner) + testRunner.dumpAsText(); + + function leak() { + var observer = new WebKitMutationObserver(function() { observer.disconnect(); }); + } + + for (i=0; i < 1000; i++) leak(); + gc(); +</script> 
diff --git a/ManualTests/leak-observer-nonmain-world.html b/ManualTests/leak-observer-nonmain-world.html new file mode 100644 index 0000000..3fd736c --- /dev/null +++ b/ManualTests/leak-observer-nonmain-world.html 
@@ -0,0 +1,30 @@ +<!DOCTYPE html> + +<p>Test that using mutation observers from the non-main world doesn't leak the document.</p> +<p>Expected output of this test is LEAK: 28 WebCoreNode</p> + +<iframe></iframe> + +<script> +testRunner.dumpAsText(); +testRunner.waitUntilDone(); + +var iframe = document.querySelector('iframe'); +var count = 0; +var totalRuns = 5; + +iframe.onload = function() { + if (count++ < totalRuns) { + testRunner.evaluateScriptInIsolatedWorld(1, 'new MutationObserver(function(){}).observe(document, {childList: true, subtree: true});'); + iframe.srcdoc = "<body><input autofocus></body>"; + GCController.collect(); + } else { + GCController.collect(); + testRunner.notifyDone(); + } +}; + +// Need autofocus since evaluateScriptInIsolatedWorld runs in the focused frame. +iframe.srcdoc = "<body><input autofocus></body>"; +</script> + 
diff --git a/ManualTests/left-overflow-repaint.html b/ManualTests/left-overflow-repaint.html new file mode 100644 index 0000000..5616c4b --- /dev/null +++ b/ManualTests/left-overflow-repaint.html 
@@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=7916">Bugzilla bug 7916</a> Box repaint rect does not include the left overflow</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Scroll and resize the window as necessary to bring the three test cases below into view. +Press each Test button once. Do not scroll, resize, or hide the window or switch to another +tab. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +In each test, &ldquo;Lorem&rdquo; will move down along with &ldquo;ipsum&rdquo;.  +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +&ldquo;Lorem&rdquo; will stay behind as &ldquo;ipsum&rdquo; moves down. +</p> + +<div style="height: 120px"> + <p> + <button onclick="document.getElementById('t').style.marginTop = '2em'"> + Test 1 + </button> + Move block with left overflow + </p> + <div id="t" style="text-indent: -50px; background: silver; margin-left: 50px;"> + Lorem ipsum + </div> +</div> +<hr> +<div style="height: 120px"> + <p> + <button onclick="document.getElementById('u').style.lineHeight = '3'"> + Test 2 + </button> + </p> + Move line with left overflow + <div style="text-indent: -50px; background: silver; margin-left: 50px;"> + Lorem <span id="u">ipsum</span> + </div> +</div> +<hr> +<div style="height: 120px"> + <p> + <button onclick="document.getElementById('v').style.height = '3em'"> + Test 3 + </button> + Change height of table cell with left overflow + </p> + <table style="margin-left: 50px;"><tr> + <td id="v" style="text-indent: -50px; background: silver;"> + Lorem ipsum + </td></tr></table> +</div> + +</body> +</html> 
diff --git a/ManualTests/link-activation-fails-after-double-tap-gesture.html b/ManualTests/link-activation-fails-after-double-tap-gesture.html new file mode 100644 index 0000000..84cdd8d --- /dev/null +++ b/ManualTests/link-activation-fails-after-double-tap-gesture.html 
@@ -0,0 +1,7 @@ +<html> +<body> + <p>This test verifies that after the double tap gesture, links can still be activated.</p> + <p>Double tap <span style='color: red'>here</span> and <a href="data:text/html,<html><body style='background-color:green'>PASS</body></html>">try to activate this link</a> with single tap.</p> + <p>PASS if new page loads.</p> +</body> +</html> 
diff --git a/ManualTests/link-cursor-auto.html b/ManualTests/link-cursor-auto.html new file mode 100644 index 0000000..b978b4b --- /dev/null +++ b/ManualTests/link-cursor-auto.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/5551163">5551163</a> REGRESSION: Cursor does not change to arrow on "X" button in google maps, making it hard to click</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Move the mouse over the link below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The mouse pointer will change to an index finger. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The mouse pointer will change to a wristwatch. +</p> + +<span style="cursor: wait;"><a href="#">This is the link</a></span> + +</body> +</html> 
diff --git a/ManualTests/linkjump-1.html b/ManualTests/linkjump-1.html new file mode 100644 index 0000000..0af0fe6 --- /dev/null +++ b/ManualTests/linkjump-1.html 
@@ -0,0 +1,79 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4304213">4304213</a> sometimes have to click twice to jump to top, on href=""</p> +<b>As of 01-31-2006, this bug has NOT been fixed.</b> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click through the numbered links on this page. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Page will scroll to the top after clicking link #3.  +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Page will scroll to the top after clicking link #3. Clicking this link twice might take you to the top of the page (but that is the bug).  + +</p> + +<div><a href="#foo">1. click here</a></div> + +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. +</p> + +<div id="foo"><a href="#foo2">2. click here</a></div> + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P><p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P> + + +<div id="foo2"><a href="">3. click here (page should scroll to the top)</a></div> + + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem.</P> + +</body> +</html> 
diff --git a/ManualTests/linkjump-2.html b/ManualTests/linkjump-2.html new file mode 100644 index 0000000..03eee77 --- /dev/null +++ b/ManualTests/linkjump-2.html 
@@ -0,0 +1,37 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG IDs:</b></p> +<a href="rdar://4233844">4233844</a> in some cases, HTML href named anchors don't scroll to the right place<br> +<a href="rdar://problem/4246096">4246096</a> REGRESSION links to named anchors don't scroll to the right place (4825) + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Manually resize window to about 800 x 600. Click on the links below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Page will scroll as indicated. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Page will NOT scroll, or will not scroll to the position indicated. +</p> + +<a href="#0">1. Click here. Page should scroll to TARGET TEXT.</a> + +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum consectetuer nulla a ligula. Vestibulum aliquet neque ac nunc. Sed ornare, ipsum sed blandit iaculis, nulla urna suscipit felis, id elementum dolor mi ac velit. Etiam quis velit vitae felis pretium venenatis. Donec lobortis, dui eget imperdiet tristique, velit pede rhoncus sapien, sed interdum quam felis mattis lectus. Sed quis sem. Curabitur pharetra felis eu eros suscipit egestas. Aenean tempus varius urna. Ut dolor. Fusce sem dolor, facilisis et, mollis ac, adipiscing ac, ipsum. Morbi fringilla, diam eget tincidunt consectetuer, mauris lectus vulputate quam, id ornare enim magna in pede. Vivamus commodo, sapien eget aliquam convallis, purus eros blandit libero, eget viverra diam nibh vel mi. Duis iaculis mollis ipsum. Duis accumsan posuere urna. Cras tempus. Pellentesque eu ante. Vestibulum nunc erat, tempus id, nonummy et, ullamcorper ac, odio. Aenean tincidunt enim sed ligula pellentesque lobortis. Donec pellentesque luctus nisl. Maecenas blandit lacus et lacus. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum consectetuer nulla a ligula. Vestibulum aliquet neque ac nunc. Sed ornare, ipsum sed blandit iaculis, nulla urna suscipit felis, id elementum dolor mi ac velit. Etiam quis velit vitae felis pretium venenatis. Donec lobortis, dui eget imperdiet tristique, velit pede rhoncus sapien, sed interdum quam felis mattis lectus. Sed quis sem. Curabitur pharetra felis eu eros suscipit egestas. Aenean tempus varius urna. Ut dolor. Fusce sem dolor, facilisis et, mollis ac, adipiscing ac, ipsum. Morbi fringilla, diam eget tincidunt consectetuer, mauris lectus vulputate quam, id ornare enim magna in pede. Vivamus commodo, sapien eget aliquam convallis, purus eros blandit libero, eget viverra diam nibh vel mi. Duis iaculis mollis ipsum. Duis accumsan posuere urna. Cras tempus. Pellentesque eu ante. Vestibulum nunc erat, tempus id, nonummy et, ullamcorper ac, odio. Aenean tincidunt enim sed ligula pellentesque lobortis. Donec pellentesque luctus nisl. Maecenas blandit lacus et lacus.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum consectetuer nulla a ligula. Vestibulum aliquet neque ac nunc. Sed ornare, ipsum sed blandit iaculis, nulla urna suscipit felis, id elementum dolor mi ac velit. Etiam quis velit vitae felis pretium venenatis. Donec lobortis, dui eget imperdiet tristique, velit pede rhoncus sapien, sed interdum quam felis mattis lectus. Sed quis sem. Curabitur pharetra felis eu eros suscipit egestas. Aenean tempus varius urna. Ut dolor. Fusce sem dolor, facilisis et, mollis ac, adipiscing ac, ipsum. Morbi fringilla, diam eget tincidunt consectetuer, mauris lectus vulputate quam, id ornare enim magna in pede. Vivamus commodo, sapien eget aliquam convallis, purus eros blandit libero, eget viverra diam nibh vel mi. Duis iaculis mollis ipsum. Duis accumsan posuere urna. Cras tempus. Pellentesque eu ante. Vestibulum nunc erat, tempus id, nonummy et, ullamcorper ac, odio. Aenean tincidunt enim sed ligula pellentesque lobortis. Donec pellentesque luctus nisl. Maecenas blandit lacus et lacus. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum consectetuer nulla a ligula. Vestibulum aliquet neque ac nunc. Sed ornare, ipsum sed blandit iaculis, nulla urna suscipit felis, id elementum dolor mi ac velit. Etiam quis velit vitae felis pretium venenatis. Donec lobortis, dui eget imperdiet tristique, velit pede rhoncus sapien, sed interdum quam felis mattis lectus. Sed quis sem. Curabitur pharetra felis eu eros suscipit egestas. Aenean tempus varius urna. Ut dolor. Fusce sem dolor, facilisis et, mollis ac, adipiscing ac, ipsum. Morbi fringilla, diam eget tincidunt consectetuer, mauris lectus vulputate quam, id ornare enim magna in pede. Vivamus commodo, sapien eget aliquam convallis, purus eros blandit libero, eget viverra diam nibh vel mi. Duis iaculis mollis ipsum. Duis accumsan posuere urna. Cras tempus. Pellentesque eu ante. Vestibulum nunc erat, tempus id, nonummy et, ullamcorper ac, odio. Aenean tincidunt enim sed ligula pellentesque lobortis.  +<a name="0"> +</a> +TARGET TEXT +<p><a href="#anchor">2. Click here. Page should scroll just a little bit, to the top of the red box below.</a></p> +<a name="anchor"></a> +<div style="width:100%; border:1px red solid; height:1000px;"></div> + + +</body> +</html> 
diff --git a/ManualTests/linkjump-3.html b/ManualTests/linkjump-3.html new file mode 100644 index 0000000..64e46c0 --- /dev/null +++ b/ManualTests/linkjump-3.html 
@@ -0,0 +1,125 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=6916">Bugzilla 6916</a> REGRESSION: URLs with named anchors in a page don't jump to proper location in document</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Manually resize window to about 800 x 600. Click the link below.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Page will scroll down to the dashed line. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Page will scroll to the bottom, or to some other unexpected area of the page. +</p> + +<div>Clicking <a href="#link">link</a> should move page down to the dashes, not to the end of the page.</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<font face="arial,sans-serif" size="2"><a name="link"></a> +<div>--------------</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> +<div>blah blah blah</div> + +</body> +</html> 
diff --git a/ManualTests/linkjump-4.html b/ManualTests/linkjump-4.html new file mode 100644 index 0000000..733277a --- /dev/null +++ b/ManualTests/linkjump-4.html 
@@ -0,0 +1,132 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4247537">4247537</a> link jumping should scroll to tallest object on line, not first object on line</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Manually resize window to about 800 x 600. Click the links in this document.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +After clicking a link, the page should always scroll to the top of the green box. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +After clicking a link, page scrolls to some unexpected area. +</p> + +<div><a href="#foo">1. click to test</a></div> + +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. +</p> + +** The top of this box <img id="foo" style="height: 200px; width: 100px; background-color: green"> should be aligned to the top of the window ** + +<div><a href="#foo2">2. click to test</a></div> + + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Curabitur facilisis pede nec arcu. Proin ut turpis. Maecenas quam nulla, dapibus vel, accumsan non, volutpat quis, tellus. Suspendisse consectetuer augue in mauris. Duis consequat pede sit amet dolor. Nulla vestibulum enim auctor felis tincidunt sodales. Nullam lobortis massa eu magna. Ut nonummy leo porta quam. Proin dignissim, ante ut aliquet dignissim, est odio aliquet lacus, eu sodales quam arcu ornare urna. Fusce arcu erat, vulputate pulvinar, dapibus luctus, volutpat quis, metus. Mauris eu massa. Praesent eget tortor eget arcu fringilla feugiat. Mauris posuere, risus nec blandit ultrices, enim odio tincidunt tortor, non bibendum elit mi non justo. Fusce tristique lacinia est. Maecenas est sem, eleifend a, fermentum et, interdum non, elit. Etiam sem. Vestibulum ultricies velit. Vivamus a mauris eget arcu volutpat vestibulum. Duis sed dui sit amet libero tempus tempor. Nulla diam.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Curabitur facilisis pede nec arcu. Proin ut turpis. Maecenas quam nulla, dapibus vel, accumsan non, volutpat quis, tellus. Suspendisse consectetuer augue in mauris. Duis consequat pede sit amet dolor. Nulla vestibulum enim auctor felis tincidunt sodales. Nullam lobortis massa eu magna. Ut nonummy leo porta quam. Proin dignissim, ante ut aliquet dignissim, est odio aliquet lacus, eu sodales quam arcu ornare urna. Fusce arcu erat, vulputate pulvinar, dapibus luctus, volutpat quis, metus. Mauris eu massa. Praesent eget tortor eget arcu fringilla feugiat. Mauris posuere, risus nec blandit ultrices, enim odio tincidunt tortor, non bibendum elit mi non justo. Fusce tristique lacinia est. Maecenas est sem, eleifend a, fermentum et, interdum non, elit. Etiam sem. Vestibulum ultricies velit. Vivamus a mauris eget arcu volutpat vestibulum. Duis sed dui sit amet libero tempus tempor. Nulla diam.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum.</p> + + +<span id="foo2">** The top of this box should be aligned <img style="height: 200px; width: 100px; background-color: green"> to the top of the window **</span> + +<div><a href="#foo3">3. click to test</a></div> + + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Curabitur facilisis pede nec arcu. Proin ut turpis. Maecenas quam nulla, dapibus vel, accumsan non, volutpat quis, tellus. Suspendisse consectetuer augue in mauris. Duis consequat pede sit amet dolor. Nulla vestibulum enim auctor felis tincidunt sodales. Nullam lobortis massa eu magna. Ut nonummy leo porta quam. Proin dignissim, ante ut aliquet dignissim, est odio aliquet lacus, eu sodales quam arcu ornare urna. Fusce arcu erat, vulputate pulvinar, dapibus luctus, volutpat quis, metus. Mauris eu massa. Praesent eget tortor eget arcu fringilla feugiat. Mauris posuere, risus nec blandit ultrices, enim odio tincidunt tortor, non bibendum elit mi non justo. Fusce tristique lacinia est. Maecenas est sem, eleifend a, fermentum et, interdum non, elit. Etiam sem. Vestibulum ultricies velit. Vivamus a mauris eget arcu volutpat vestibulum. Duis sed dui sit amet libero tempus tempor. Nulla diam.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor.</p> + + + + +<img style="height: 200px; width: 100px; background-color: yellow"><img id="foo3" style="height: 100px; width: 100px; background-color: green">** The top of the GREEN box should be aligned to the top of the window ** + +<div><a href="#foo4">4. click to test</a></div> + + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Curabitur facilisis pede nec arcu. Proin ut turpis. Maecenas quam nulla, dapibus vel, accumsan non, volutpat quis, tellus. Suspendisse consectetuer augue in mauris. Duis consequat pede sit amet dolor. Nulla vestibulum enim auctor felis tincidunt sodales. Nullam lobortis massa eu magna. Ut nonummy leo porta quam. Proin dignissim, ante ut aliquet dignissim, est odio aliquet lacus, eu sodales quam arcu ornare urna. Fusce arcu erat, vulputate pulvinar, dapibus luctus, volutpat quis, metus. Mauris eu massa. Praesent eget tortor eget arcu fringilla feugiat. Mauris posuere, risus nec blandit ultrices, enim odio tincidunt tortor, non bibendum elit mi non justo. Fusce tristique lacinia est. Maecenas est sem, eleifend a, fermentum et, interdum non, elit. Etiam sem. Vestibulum ultricies velit. Vivamus a mauris eget arcu volutpat vestibulum. Duis sed dui sit amet libero tempus tempor. Nulla diam.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor.</p> + + + +<a name="foo4"></a> +<img style="height: 100px; width: 100px; background-color: green">** The top of this box should be aligned to the top of the window ** + +<div><b>You're done!</b></div> + + +<p> +Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor. + +Curabitur facilisis pede nec arcu. Proin ut turpis. Maecenas quam nulla, dapibus vel, accumsan non, volutpat quis, tellus. Suspendisse consectetuer augue in mauris. Duis consequat pede sit amet dolor. Nulla vestibulum enim auctor felis tincidunt sodales. Nullam lobortis massa eu magna. Ut nonummy leo porta quam. Proin dignissim, ante ut aliquet dignissim, est odio aliquet lacus, eu sodales quam arcu ornare urna. Fusce arcu erat, vulputate pulvinar, dapibus luctus, volutpat quis, metus. Mauris eu massa. Praesent eget tortor eget arcu fringilla feugiat. Mauris posuere, risus nec blandit ultrices, enim odio tincidunt tortor, non bibendum elit mi non justo. Fusce tristique lacinia est. Maecenas est sem, eleifend a, fermentum et, interdum non, elit. Etiam sem. Vestibulum ultricies velit. Vivamus a mauris eget arcu volutpat vestibulum. Duis sed dui sit amet libero tempus tempor. Nulla diam.Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In ornare risus. Aliquam nonummy libero et risus. Vestibulum sit amet massa nec mauris interdum luctus. Nam ut dolor ut nunc malesuada varius. Duis risus. Mauris vel nulla ut odio porta vestibulum. Mauris ac sapien. In a dolor at urna malesuada suscipit. Aenean nisl erat, nonummy quis, blandit in, sagittis et, ligula. Maecenas consequat. Donec nonummy rutrum nibh. Praesent tincidunt cursus mi. Donec adipiscing. Nulla at ipsum. Aenean fermentum. + +Donec libero est, semper non, pretium vel, adipiscing dapibus, justo. Morbi viverra, odio at suscipit sollicitudin, risus felis convallis odio, sit amet mollis mauris nisl ac magna. Donec tincidunt ante non ante ultricies rutrum. Sed enim sem, pharetra faucibus, faucibus a, venenatis nec, sem. Fusce lacus. Vestibulum porta urna. Vivamus nonummy gravida nisl. In pharetra eros ac arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nullam et lacus. Nunc metus nunc, iaculis eu, bibendum molestie, semper vitae, arcu. Nullam accumsan fringilla diam. Mauris odio risus, facilisis vitae, tincidunt eget, placerat nec, lacus. Mauris faucibus. Donec rutrum mauris non elit. Morbi dolor purus, auctor a, euismod at, vestibulum sed, massa. Suspendisse quis lorem. + +Donec blandit vestibulum mi. Donec turpis nisl, accumsan ut, vestibulum sed, mattis vel, turpis. Suspendisse placerat ultricies pede. Donec et diam vel libero volutpat vestibulum. Aenean luctus erat vitae urna. Etiam ac ligula. Praesent vestibulum urna vel lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque hendrerit porta lectus. Pellentesque sed velit sed massa malesuada egestas. Phasellus volutpat mauris vitae massa. Sed pretium est quis nulla. Quisque fringilla neque a nunc. Vivamus ligula risus, pharetra vitae, sodales ut, convallis et, quam. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed a purus at turpis pellentesque porttitor. + +Integer consequat justo. Duis cursus. Sed lorem ante, aliquam sed, mattis eu, luctus in, elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Morbi sem. Nam id pede et lectus luctus molestie. Vestibulum vulputate accumsan lectus. Proin ipsum libero, sagittis at, facilisis vitae, condimentum eu, urna. Vestibulum turpis magna, euismod in, pretium quis, cursus ut, diam. Vivamus in felis eget leo ultricies eleifend. Suspendisse sit amet dolor. Nam diam eros, tempor ut, tristique ut, accumsan commodo, neque. Etiam a orci eu ante suscipit tempor.</p> +</body> +</html> 
diff --git a/ManualTests/linkjump-5.html b/ManualTests/linkjump-5.html new file mode 100644 index 0000000..7310eb8 --- /dev/null +++ b/ManualTests/linkjump-5.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4256060">4256060</a> Link scrolling to last object on the page doesn't work if the link being scrolled to contains an empty inline</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Manually resize window to about 800 x 600. Click the link below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Page should scroll to the bottom.</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Page will not scroll to the bottom. +</p> + +<a href="#ccc">Click me</a> +<div style="border: 1px solid red; height: 800px"></div> +<a name="ccc"><b></b></a> +</body> +</html> 
diff --git a/ManualTests/liveconnect-applet-array-parameters.html b/ManualTests/liveconnect-applet-array-parameters.html new file mode 100644 index 0000000..8f685c9 --- /dev/null +++ b/ManualTests/liveconnect-applet-array-parameters.html 
@@ -0,0 +1,32 @@ +<html> +<head> + <title>Array parameters Applet</title> +</head> +<body> +<h1>Calling Java Array Test page</h1> +This page calls a Java method which takes Arrays as parameters. On successful calling of the function, the passed in values are printed +to stdout from Java using System.out.println +Send object array should fail, but WebKit should not crash. +<form name="controls"> + <input type="button" name="string" value="Send String array" onClick="document.arraytestapplet.arrayFunction(['one', 'two', 'three'])"/><br> + <input type="button" name="boolean" value="Send boolean array" onClick="document.arraytestapplet.booleanFunction(['0', '1', '2'])"/><br> + <input type="button" name="byte" value="Send byte array" onClick="document.arraytestapplet.byteFunction(new Array(0, 1, 2))"/><br> + <input type="button" name="char" value="Send char array" onClick="document.arraytestapplet.charFunction(new Array('a', 'b', 'c'))"/><br> + <input type="button" name="short" value="Send short array" onClick="document.arraytestapplet.shortFunction(new Array(0, 1, 2))"/><br> + <input type="button" name="int" value="Send int array" onClick="document.arraytestapplet.intFunction(new Array(0, 1, 2))"/><br> + <input type="button" name="long" value="Send long array" onClick="document.arraytestapplet.longFunction(new Array(0, 1, 2))"/><br> + <input type="button" name="float" value="Send float array" onClick="document.arraytestapplet.floatFunction(new Array(0.0, 0.1, 0.2))"/><br> + <input type="button" name="double" value="Send double array" onClick="document.arraytestapplet.doubleFunction(new Array(0.1, 0.1, 0.2))"/><br> + <input type="button" name="object" value="Send object array" onClick="document.arraytestapplet.objectFunction(new Array(0.1, 0.1, 0.2))"/><br> +</form> +<applet name="arraytestapplet" code="ArrayParameterTestApplet.class" codebase="resources" width="0" height="0" mayscript="true"> +Unable to load applet. +</applet> +<!-- +<object id="helloapplet" codetype="application/java-archive" + classid="java:HelloApplet.class" archive="helloapplet.jar" + height="100" width="200"> +Unable to load applet. +</object> --> +</body> +</html> 
diff --git a/ManualTests/liveconnect-applet-get-boolean.html b/ManualTests/liveconnect-applet-get-boolean.html new file mode 100644 index 0000000..0c0eddf --- /dev/null +++ b/ManualTests/liveconnect-applet-get-boolean.html 
@@ -0,0 +1,7 @@ +<html> +<body><applet code="CheckerApplet.class" name="Checker" codebase="resources"> +Unable to load applet.</applet> +This tests retrieving a boolean value from a Java class using javascript. It tests the return value. The return value should be true.<br> +<input type="button" name="test" value="Read applet" onClick="alert('return value: '+document.Checker.checkVersion())"/> +</body> +<html> 
diff --git a/ManualTests/liveconnect-security-exception.html b/ManualTests/liveconnect-security-exception.html new file mode 100644 index 0000000..8bce752 --- /dev/null +++ b/ManualTests/liveconnect-security-exception.html 
@@ -0,0 +1,32 @@ +<html> +<head> +<!-- +Sorry for the hackery in this test. Currently, we have no elegant way to +catch Java errors and print out an intelligent response. +--> + +<script> +function loadApplet() { + // force Safari to load and cache the TestApplet class + document.getElementById('applet').method(); +} +</script> +</head> +<body onload="loadApplet();window.open('resources/liveconnect-security-exception-popup.html', 'w', 'height=300, width=300');"> +<p>This test checks for a regression against <i>rdar://problem/4151132 REGRESSION: Some applet liveconnect calls throws privilege exception.</i>.</p> +<p>To test:</p> +<ol> +<li>Disable popup blocking.</li> +<li>Select the window titled "popup window."</li> +<li>From the debug menu, select "Show JavaScript console." This will allow you to see errors thrown in the popup window by the Java Virtual Machine. If there are any, the test has failed.</li> +<li>If the text in the popup window does not match the text below, the test has failed:<br> +applet.field returned 1<br> +incremented applet.field by 1<br> +applet.field returned 2<br> +applet.method() returned 1<br> +</li> +<li>Otherwise, the test has passed.</li> +</ol> +<applet id='applet' code="TestApplet.class" codebase="resources"></applet> +</body> +</html> 
diff --git a/ManualTests/load-deferrer-resume-crash.html b/ManualTests/load-deferrer-resume-crash.html new file mode 100644 index 0000000..89f15b1 --- /dev/null +++ b/ManualTests/load-deferrer-resume-crash.html 
@@ -0,0 +1,33 @@ +<html> +<head> +<script> +var counter = 0; + +function loadJSFile(){ + var i = document.createElement('img') + i.setAttribute("src", "resources/apple.jpg?counter=" + counter); + + counter++; + + document.getElementById("images").appendChild(i); +} + +function runModal() +{ + loadJSFile(); +  + alert("Deferring loads"); +} +</script> +</head> +  +<body> + +<input id="button" type="button" value="click me" onclick="runModal()"/> +  +<div id="images"></div> + +<p>Click the above button to start loading an image and then open an alert() box. For the test to pass there should be no crash when closing the alert box.</p> + +</body> +</html> 
diff --git a/ManualTests/load-deferrer-script-element.html b/ManualTests/load-deferrer-script-element.html new file mode 100644 index 0000000..c0ad773 --- /dev/null +++ b/ManualTests/load-deferrer-script-element.html 
@@ -0,0 +1,44 @@ +<html> +<head> +<script> +function log(message) +{ + document.getElementById("result").innerHTML += message + "<br>"; +} + +function loadJSFile(){ + var s = document.createElement('script') + s.setAttribute("type", "text/javascript") + s.setAttribute("src", "resources/load-deferrer-script-element.js") + + document.getElementsByTagName("head")[0].appendChild(s); +} + +jsLoaded = false; +runningModal = false; + +// This line will load external script into memory. +loadJSFile(); + +function runModal() +{ + jsLoaded = true; + loadJSFile(); +  + runningModal = true; + alert("Scripts should not be running in the background!"); + runningModal = false; +} +</script> +</head> +  +<body> +  +<p>This tests the bug https://bugs.webkit.org/show_bug.cgi?id=38910. +Click the button, wait 5 seconds and close it. +The test passes if no error messages show up in the page!</p> +<input id="button" type="button" value="click me" onclick="runModal()"/> +<p id="result"></p> + +</body> +</html> 
diff --git a/ManualTests/localstorage-empty-database.html b/ManualTests/localstorage-empty-database.html new file mode 100644 index 0000000..d0fcc41 --- /dev/null +++ b/ManualTests/localstorage-empty-database.html 
@@ -0,0 +1,16 @@ +<html> +<body> +<script type="text/javascript"> + var x = localStorage.getItem('foo'); +</script> +<p>This page has called <code>localStorage.getItem('foo')</code>. +Since no data has been stored, no database file should have been created.</p> + +<p>If you click <a href="javascript:localStorage.setItem('bar', 'baz');">here</a>, data will be stored, and a database file should be created.</p> + +<p>If you click <a href="javascript:localStorage.clear();">here</a>, the local storage will be cleared, and the database file should be gone when the browser is closed.</p> + +<p>(This is for <a href="https://bugs.webkit.org/show_bug.cgi?id=40301">https://bugs.webkit.org/show_bug.cgi?id=40301</a> +and <a href="https://bugs.webkit.org/show_bug.cgi?id=40767">https://bugs.webkit.org/show_bug.cgi?id=40767</a>.)</p> +</body> +</html> 
diff --git a/ManualTests/localstorage-value-truncation.html b/ManualTests/localstorage-value-truncation.html new file mode 100644 index 0000000..242376a --- /dev/null +++ b/ManualTests/localstorage-value-truncation.html 
@@ -0,0 +1,31 @@ +<html> +<body> + <p>In this test we need to find out if the browser can save the localStorage item correctly without truncated by the \x00 in the middle of the string.</p> +<script type="text/javascript"> + var key = 'TruncVal'; + var value = '123\x00567'; + + var x = localStorage.getItem(key); + if (!x) { + localStorage.setItem(key, value); + document.write("<p>It hasn't got the '" + key + "' in the localStorage database, will create it using:<br>"); + document.write("<code>localStorage.setItem('" + key + "', '" + value + "');</code><br>"); + document.write("Now close your browser and start it again to see the results.</p>"); + } + else { + document.write("<p>The value of " + key + " is: '" + x + "', the length is: " + x.length + "<br>"); + + if (x == value) { + document.write("PASS."); + } + else { + document.write("FAIL: The expected value is: '" + value + "', the expected length is: " + value.length); + } + document.write("</p><a href=\"javascript:localStorage.removeItem('" + key + "');\">remove '" + key + "' from localStorage</a>"); + } +</script> + +<p>This is for <a href="https://bugs.webkit.org/show_bug.cgi?id=58762">https://bugs.webkit.org/show_bug.cgi?id=58762</a> +</p> +</body> +</html> 
diff --git a/ManualTests/location-host-canonicalization.html b/ManualTests/location-host-canonicalization.html new file mode 100644 index 0000000..d13bd7d --- /dev/null +++ b/ManualTests/location-host-canonicalization.html 
@@ -0,0 +1,15 @@ +<html> +<head> +<script>  +function changeHost() { + window.location.host = "www.example.com:"; +} +</script> +</head> +<body> +<p>This will test the URL canonicalization by assigning a host with an empty port specifier to window.location.host</p> +<p>Clicking the following button should change the host in the current URL to "www.example.com:". It actually loading is not important -  +if you see "www.example.com:0" the test has failed. You should see "www.example.com:"</p> +<input type="button" value="Click Here" onClick="changeHost();"> +</body> +</html> 
diff --git a/ManualTests/log-keypress-events.html b/ManualTests/log-keypress-events.html new file mode 100644 index 0000000..87e2288 --- /dev/null +++ b/ManualTests/log-keypress-events.html 
@@ -0,0 +1,34 @@ +<html> +<body> +<p>This page is especially useful to test <a href="http://bugs.webkit.org/show_bug.cgi?id=5678">the shift-Tab issue</a>. Should see a code of 9.</p> +<form name="f"> +Type here: <input id="field" type="text" /> +</form> +<script language="javascript" type="text/javascript"> +<!-- +function logEvent(event) { + myDebugLog("--"); + if (event.charCode) + myDebugLog("event.charCode: " + event.charCode); + if (event.which) + myDebugLog("event.which: " + event.which); + if (event.keyCode) + myDebugLog("event.keyCode: " + event.keyCode); + myDebugLog("shiftKey: " + event.shiftKey); + return false; +} + +function myDebugLog(msg) { + var m = document.createElement("div"); + m.appendChild(document.createTextNode(msg)); + document.getElementById("debug-log").appendChild(m); +} +document.f.field.onkeypress = logEvent; +// --> +</script> + +<div id="debug-log"> +Key press values: +</div> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/mail-attachments.html b/ManualTests/mail-attachments.html new file mode 100644 index 0000000..9d8d920 --- /dev/null +++ b/ManualTests/mail-attachments.html 
@@ -0,0 +1,16 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4435416">4435416</a> Attachments in Mail compose windows always display the broken image icon</p> +<p>Steps:</p> +<ol> +<li>Launch Mail.app with built WebKit +<li>create a new email +<li>drag a file to the email (make sure to use a > 1 page file, otherwise Mail shows the contents inline) +</ol> +<p>Verify that the icon is what you see in Finder and has the file name and size beneath it</p> +</body> +</html> 
diff --git a/ManualTests/mask-composite-missing-images.html b/ManualTests/mask-composite-missing-images.html new file mode 100644 index 0000000..ed0dfcd --- /dev/null +++ b/ManualTests/mask-composite-missing-images.html 
@@ -0,0 +1,23 @@ +<html> +<head> +<style> +.test { + width: 200px; + height: 200px; + border:10px solid black; + background-color:lime; + -webkit-mask-image: url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found), url(url-not-found); + -webkit-mask-position: top left, top right, bottom left, bottom right, top center, center right, bottom center, center left, center; + -webkit-mask-origin: border; + -webkit-mask-repeat: no-repeat, no-repeat, no-repeat, no-repeat, repeat-x, repeat-y, repeat-x, repeat-y, repeat; + -webkit-mask-composite: copy; +} +</style> +</head> +<body> +<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=26084">WebKit Bug 26084: Bug 26084: Multiple missing images in webkit-mask-image prevent rendering</a></p> +<div class="test">This text should be visible.</div> +<p>If the test passes, you should be able to see a lime square with a black border. Inside the border, you should see the text: This text should be visible.</p> +</body> +</html> + 
diff --git a/ManualTests/match-marker-rects.html b/ManualTests/match-marker-rects.html new file mode 100644 index 0000000..d650965 --- /dev/null +++ b/ManualTests/match-marker-rects.html 
@@ -0,0 +1,33 @@ +<style> + div { + height: 50px; + width: 110px; + margin: 10px 0; + padding: 10px; + border: solid black; + font-size: 25px; + } + + div.columns { + -webkit-columns: 2; + -webkit-column-gap: 10px; + } + + div.scroll { + overflow-y: scroll;  + } +</style> +<p> + In Safari, choose Edit > Find > Find, and type the strings &ldquo;xyz&rdquo; + and &ldquo;123&rdquo;. The white &ldquo;holes&rdquo; in the Find overlay + should line up with the matching text below. +</p> +<div class="columns"> + <br>xyz +</div> +<div class="scroll" id="scroll"> + <br><br>123<br><br> +</div> +<script> + document.getElementById("scroll").scrollTop = 100; +</script> 
diff --git a/ManualTests/media-controls-when-javascript-disabled.html b/ManualTests/media-controls-when-javascript-disabled.html new file mode 100644 index 0000000..b7e52bc --- /dev/null +++ b/ManualTests/media-controls-when-javascript-disabled.html 
@@ -0,0 +1,26 @@ +<html> + <head> + <style> #error { display: none; } </style> + <script> + function showErrorMsg()  + { + document.getElementById('error').style.display = 'block'; + } + </script> + </head> +  +<body onload="showErrorMsg()"> + + <p>TEST: Video should have controls when scripting is disabled.</p> + + <video  + src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov"> + </video> + + <noscript><p>Scripting is DISABLED.</p></noscript> + + <p id=error>ERROR: JavaScript must be disabled for this test.</p> + + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/media-controls.html b/ManualTests/media-controls.html new file mode 100644 index 0000000..8b0fe0c --- /dev/null +++ b/ManualTests/media-controls.html 
@@ -0,0 +1,254 @@ +<html> +<head> +<style> + +body { + display: -webkit-box; + margin: 0; + font-family: Sans-serif; + overflow: hidden; +} + +#list { + width: 200px; + padding: 10px; +} + +#list h1 { + margin: 0; + font-size: 16px; + padding: 0 0 14px 8px; + border-right: 4px solid LightGray; +} + +#list ul { + margin: 0; + padding: 2px 0 0 0; + list-style: none; +} + +#list a:target { + cursor: default; + pointer-events: none; + background-color: #eee; + border-right: 4px solid Gray; +} + +#list li { + padding-bottom: 2px; +} + +#list a { + padding: 8px 8px 8px 8px; + display: block; + border-right: 4px solid LightGray; + color: initial; + -webkit-transition-property: border-right, background-color; + -webkit-transition-duration: 0.4s; +} + +#test { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-box-flex: 0.5; +} + +#arena { + -webkit-box-flex: 0.5; + border: none; + display: -webkit-box; +} + +#description { + height: 200px; + font-size: 12px; + padding-right: 16px; + overflow: auto; +} + +</style> +<!-- LayoutTests location is hard-coded to avoid duplication of code. --> +<script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script> +<script> + +var MEDIA_FILES_LOCATION = 'http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content'; + +var MEDIA_FILES; + +var TESTS = { + +'video': { + title: 'Typical video with controls', + description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' + + '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' + + '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' + + 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>', + html: '<video controls src={video}></video>', +}, +'audio': { + title: 'Typical audio with controls', + description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' + + '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' + + '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' + + 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>', + html: '<audio controls src={audio}></audio>', +}, +'video-volume': { + title: 'Video volume controls', + description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + + '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + + '<p>Moving the mouse away from the volume control should make the control disappear.</p>', + html: '<video controls src={video}></video>', +}, +'audio-volume': { + title: 'Audio volume controls', + description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + + '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + + '<p>Moving the mouse away from the volume control should make the control disappear.</p>', + html: '<audio style="padding-top: 200px;" controls src={video}></audio>', +}, +'audio-volume-neg': { + title: 'Audio volume controls (negative offset)', + description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + + '<p>In this particular layout, the volume control should be positioned directly under the "Mute" button, showing two "Mute" buttons --' + + 'one on the main controls and another on the volume control.</p>' + + '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + + '<p>Moving the mouse away from the volume control or the "Mute" button should make the control disappear.</p>', + html: '<audio controls src={video}></audio>', +}, +'video-zoomed': { + title: 'Magnified video', + description: '<p>Should have the same appearance as a typical video, except magnified 1.5 times.</p>' + + '<p>Make sure that the appearance of controls does not changed when changing the page zoom.</p>', + html: '<video controls src={video} style="zoom:150%"></video>', +}, +'controls-fade': { + title: 'Fading video controls', + description: '<p>When the video is playing, the controls should fade out when the mouse is away from the video and fade back in when the mouse is over the video.</p>' + + '<p>The controls should not fade when the video is paused.</p>', + html: '<video controls src={video} autoplay></video>', +}, +'timeline-resize': { + title: 'Timeline reacting to a resize', + description: '<p>When changing the width of the screen, the timeline should be the only one part of the controls changing its width.</p>' + + '<p>At a certain minimum point, the current and remaining time should disappear, giving up their space to the timeline.</p>' + + '<p>Conversely, when sizing the width up, the current and remaining time should come back into their places.', + html: '<video controls src={video} style="width:60%"></video>', +}, +'toggle-controls': { + title: 'Toggling video controls', + description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' + + '<p>The controls should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>', + js: function(click) { + if (!click) + return; + + var video = document.getElementsByTagName('video')[0]; + video.controls = !video.controls; + }, + html: '<video src={video}></video><br><button onclick="test(true)">Toggle Controls</button>', +}, +'toggle-controls-autoplay': { + title: 'Toggling video controls while playing', + description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' + + '<p>The controls should have "Rewind", "Pause", "Mute" buttons, timeline with time current and remaining shown,' + + 'with current and remaining time should changing and the thumb of the timeline gliding smoothly along the track, updated every 200ms or so.</p>' + + '<p>The controls should fade quickly if the mouse is not over the video.</p>', + js: function(click) { + if (!click) + return; + + var video = document.getElementsByTagName('video')[0]; + video.controls = !video.controls; + }, + html: '<video src={video} autoplay></video><br><button onclick="test(true)">Toggle Controls</button>', +}, +'invalid': { + title: 'Video with invalid media', + description: 'Should have "Rewind" and "Play" buttons, and "Loading..." status ' + + 'if supported. Should blink "Loading...", but not twitch or flash other controls if reloaded', + html: '<video controls src="foobar"></video>' +}, +'video-no-source': { + title: 'Video with no source', + description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.', + html: '<video controls></video>' +}, +'audio-no-source': { + title: 'Audio with no source', + description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.', + html: '<audio controls></audio>' +}, +'controls-buffer-update': { + title: 'Buffer progress bar updates', + description: '<p>The buffer progress bar should continue to update prior to video playback.</p>' + + '<p>Verify the progress bar representing the amount of video buffered continues to ' + + 'update prior to video playback. Keep the mouse pointer off the progress bar during this check ' + + 'as movement over the control will trigger a repaint which invalidates the test.</p><p>' + + 'It\'s expected that the video may stop buffering before the entire video is loaded.</p>', + html: '<video controls src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_640x360.mov' + + '?prevent_caching=' + new Date().getTime() + '"></video>' +} + +}; + +function configureMediaFiles() +{ + MEDIA_FILES = { + 'audio': absoluteUrl(findMediaFile('audio', MEDIA_FILES_LOCATION + '/test')), + 'video': absoluteUrl(findMediaFile('video', MEDIA_FILES_LOCATION + '/test')), + 'video-captioned': absoluteUrl(MEDIA_FILES_LOCATION + '/counting-captioned.mov') + } + + // FIXME: Add error reporting when resolving these fails. + + function absoluteUrl(url) + { + var a = document.createElement('a'); + a.href = url; + return '"' + a.href + '"'; + } +} + +function runTest() +{ + var test = TESTS[location.hash.substr(1)]; + if (!test) + return; + + var arena = document.getElementById('arena'); + document.getElementById('description').innerHTML = '<h2>' + test.title + '</h2>' + test.description; + if (test.html) { + arena.contentDocument.body.innerHTML = test.html.replace(/{([\w-]+)}/g, function(s, type) + { + return (MEDIA_FILES[type] || ''); + }); + } + + arena.contentDocument.body.appendChild(arena.contentDocument.createElement('script')).textContent = 'window.test = ' + (test.js ? String(test.js) : 'function() {}') + ';\nwindow.test()'; +} + +window.addEventListener('hashchange', runTest, false); + +window.addEventListener('DOMContentLoaded', function() +{ + configureMediaFiles(); + + var list = document.getElementById('list').appendChild(document.createElement('ul')); + for(var key in TESTS) + list.appendChild(document.createElement('li')).innerHTML = '<a href="#' + key + '" id="' + key + '">' + TESTS[key].title + '</a>'; + runTest(); +}, false); + +</script> +</head> +<body> +<div id="list"> + <h1>Manual Tests of Media Controls Appearance</h1> +</div> +<div id="test"> + <iframe id="arena"></iframe> + <div id="description"></div> +</div> +</body> +</html> 
diff --git a/ManualTests/media-default-playback-rate.html b/ManualTests/media-default-playback-rate.html new file mode 100644 index 0000000..b980edc --- /dev/null +++ b/ManualTests/media-default-playback-rate.html 
@@ -0,0 +1,90 @@ + +<html> + <head> + <!-- LayoutTests location is hard-coded to avoid duplication of code. --> + <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script> + <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/video-test.js"></script> + + <script> + var expectedRates = { "defaultPlaybackRate" : 1, "playbackRate" : 1}; + var playingFromScript = false; + var changedRate = false; + + function absoluteUrl(url) + { + var a = document.createElement('a'); + a.href = url; + return a.href; + } + + function testRates() + { + consoleWrite(""); + var playWithControllerButton = !changedRate && !playingFromScript; + testExpected("video.playbackRate", playWithControllerButton ? expectedRates['defaultPlaybackRate'] : expectedRates['playbackRate']); + testExpected("video.defaultPlaybackRate", expectedRates['defaultPlaybackRate']); + changedRate = false; + } + + function playing() + { + consoleWrite("<br>'playing' event"); + expectedRates['playbackRate'] = playingFromScript ? video.playbackRate : video.defaultPlaybackRate; + testRates(); + playingFromScript = false; + } + + function ratechange() + { + consoleWrite("<br>'ratechange' event"); + testRates(); + } + + function start() + { + findMediaElement(); + video.addEventListener('ratechange', ratechange); + video.addEventListener('playing', playing); + + // Use the video file from the svn repository to avoid duplicating the file. + video.src = absoluteUrl(findMediaFile('video', 'http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content/test')); + testRates(); + } + + function play() + { + playingFromScript = true; + video.play(); + } + + function setRate(which, rate) + { + changedRate = true; + video[which] = rate; + expectedRates[which] = rate; + } + + </script> + </head> + + <body onload="start()"> +  + <video controls > </video> + <ul> + <li>The current 'playbackRate' and 'defaultPlaybackRate' should be logged every time either changes.</li> + <li>'playbackRate' should be set to 'defaultPlaybackRate' when the Play button in the built-in controls is pressed</li> + <li>'playbackRate' should NOT when play() is called from script.</li> + </ul> + <div> + <button id="controls" onclick="setRate('defaultPlaybackRate', 2)">defaultPlaybackRate = 2</button> + <button id="controls" onclick="setRate('defaultPlaybackRate', 1)">defaultPlaybackRate = 1</button> + <button id="controls" onclick="setRate('playbackRate', 2)">playbackRate = 2</button> + <button id="controls" onclick="setRate('playbackRate', 1)">playbackRate = 1</button> + </div> + <div> + <button id="controls" onclick="play()">play()</button> + <button id="controls" onclick="video.pause()">pause()</button> + </div> + <br> + </body> +</html> 
diff --git a/ManualTests/media-elements/video-iframe.html b/ManualTests/media-elements/video-iframe.html new file mode 100644 index 0000000..0727e88 --- /dev/null +++ b/ManualTests/media-elements/video-iframe.html 
@@ -0,0 +1,6 @@ +<html> + <body> + <p>iframe contents for video-moved-from-iframe-to-main-page.html</p> + <video src="../../LayoutTests/media/content/test.ogv"></video> + </body> +</html> 
diff --git a/ManualTests/media-elements/video-moved-from-iframe-to-main-page.html b/ManualTests/media-elements/video-moved-from-iframe-to-main-page.html new file mode 100644 index 0000000..c344184 --- /dev/null +++ b/ManualTests/media-elements/video-moved-from-iframe-to-main-page.html 
@@ -0,0 +1,40 @@ +<html> + <head> + <script> + function getNextURL() { + var url = location.href; + var queryIndex = url.indexOf("?"); + var loadCount = 1; + if (queryIndex >= 0) { + loadCount = parseInt(url.substring(queryIndex + 1)); + if (loadCount >= 20) + return ""; + + url = url.substring(0, queryIndex); + } + return url + '?' + (loadCount + 1); + } + + function start() { + var video = document.getElementById('iframe1').contentDocument.querySelector('video'); + var documentElement = document.documentElement; + document.body.appendChild(video); + var iframe = document.querySelector('#iframe1'); + iframe.parentNode.removeChild(iframe); + + var url = getNextURL(); + if (url.length == 0) + return; + + location.href = url; + } + </script> + </head> + <body onload='start()'> + <p>Test for <a href="https://code.google.com/p/chromium/issues/detail?id=230117">Bug 230117</a><br> + This page should reload itself 20 times without crashing the tab. The test is complete when the page + stops reloading itself and the page URL ends with a ?20. + </p> + <iframe id="iframe1" src="video-iframe.html"></iframe> + </body> +</html> 
diff --git a/ManualTests/media-elements/video-preload.html b/ManualTests/media-elements/video-preload.html new file mode 100644 index 0000000..ddc324f --- /dev/null +++ b/ManualTests/media-elements/video-preload.html 
@@ -0,0 +1,230 @@ +<!doctype html> +<html> + <head> + <title>preload test</title> + <meta name="viewport" content="width=device-width"> + <style type="text/css" media="screen"> + body { font-family: georgia, serif; background: gray; } + video { background: yellow; } + .info { background-color:#e3e3f3; padding:10px; border:1px solid #9c9; width:600px; } + .info table { background: #fff; width:600px; } + .info td { border:1px solid; border-color:#fff #bbb #bbb #fff; background-color:#fff; padding:2px; font-size:.7em; width:50%;} + #event_log { background: #fff; font-size:.5em; width: 100%; } + #refresh { margin-top:10px; } + </style> + + <script> + document.addEventListener('loadedmetadata', querymovie); + document.addEventListener('waiting', querymovie); + document.addEventListener('error', querymovie); + document.addEventListener('durationchange', querymovie); + document.addEventListener('error', querymovie); + document.addEventListener('stalled', querymovie); + document.addEventListener('canplay', querymovie); + + // log all events + var events = ["abort", "beforeload", "canplay", "canplaythrough", "durationchange", "emptied", "ended", "error", "loadeddata", "loadedmetadata", "loadstart", "pause", "play", "playing", "progress", "ratechange", "seeked", "seeking", "stalled", "suspend", "timeupdate", "volumechange", "waiting", "webkitbeginfullscreen", "webkitendfullscreen"]; + for (var i=0; i < events.length; i++) + document.addEventListener(events[i], logProgress, true); + + function printTimeRangeValue(element, prop) + { + var range; +  + if (prop == 'Max time buffered') + range = element.buffered; + else if (prop == "Max time seekable") + range = element.seekable; + else + alert(prop); + if (!range) + return "undefined"; + + if (range.length) + return range.start(0).toFixed(2) + ".." + range.end(0).toFixed(2) + " [length =" + range.length + "]"; + return "[range length = " + range.length + "]"; + } +  + function statePropertyValue(element, prop) + { + var readyNames = ['HAVE_NOTHING', 'HAVE_METADATA', 'HAVE_CURRENT_DATA', 'HAVE_FUTURE_DATA', 'HAVE_ENOUGH_DATA']; + var networkNames = ['NETWORK_EMPTY', 'NETWORK_IDLE', 'NETWORK_LOADING', 'NETWORK_LOADED', 'NETWORK_NO_SOURCE']; + var value; + + if (prop== 'Ready State') + value = readyNames[element.readyState]; + else + value = networkNames[element.networkState]; + return value; + } + + function querymovie(evt) + { + var movieProperties =  + [  + ["Source", "src"],  + ["Current Source", "currentSrc"],  + ["Duration", "duration"],  + ["Video Width", "videoWidth"],  + ["Video Height", "videoHeight"],  + ["Default Playback Rate", "defaultPlaybackRate"],  + ["Volume", "volume"],  + ["Preload", "preload"],  + ["Ready State", statePropertyValue],  + ["Network State", statePropertyValue], + ["Max time buffered", printTimeRangeValue],  + ["Max time seekable", printTimeRangeValue] + ]; + + var vid = evt ? evt.target : document.getElementById('vid'); + for (var i = 0; i < movieProperties.length; i++) + { + var prop = movieProperties[i]; + var val; +  + if (typeof prop[1] == 'function') + val = prop[1](vid, prop[0]); + else + val = vid[prop[1]]; +  + if (typeof val == 'number') + val = val.toFixed(2); + else if (typeof val == "undefined") + val = "undefined"; + document.getElementById(prop[0]).innerHTML = val; + } + } + + function setURL(url) + { + var vid = document.getElementById("vid"); + + logMsg(vid, "###############"); + logMsg(vid, "##### setting url to " + url); + if ( url != "" ) + { + vid.src = url; + vid.load(); + } + } + + function clockTime() + { + var now = new Date(); + var hour = now.getHours(); + var minute = now.getMinutes(); + var second = now.getSeconds(); + var milli = now.getMilliseconds(); + if (hour > 12)  + hour = hour - 12; + else if (hour == 0)  + hour = 12; + if (hour < 10)  + hour = "0" + hour; + if (minute < 10) + minute = "0" + minute; + if (second < 10)  + second = "0" + second; + if (milli < 10)  + milli = "00" + milli; + else if (milli < 100)  + milli = "0" + milli; + + return hour + ':' + minute + ':' + second + '.' + milli; + }  + + function logMsg(vid, msg) + { + document.getElementById('event_log').value += clockTime() + " - " + msg + ' \r'; + } +  + function clearlog() + { + document.getElementById('event_log').value = ''; + } +  + function logProgress(ev) + { + var vid = ev.target; +  + if (ev.type == 'timeupdate') + { + var logTimeupdate = document.getElementById('log-timeupdate'); + if (!logTimeupdate.checked) + return; + } + if (ev.type == 'progress') + { + var logTimeupdate = document.getElementById('log-progress'); + if (!logTimeupdate.checked) + return; + } + + logMsg(vid, ev.type + ' (time = ' + vid.currentTime.toFixed(2) + ')'); + } +  + function logError(ev) + { + var vid = ev.target; + logMsg(vid, "vid.error = " + vid.error.code); + } + + + function preload(value) + { + var vid = document.getElementById("vid"); + var old = vid.preload; + vid.preload=value; + querymovie(); + } + </script> + +</head> + +<body onload="querymovie()"> + <p> + <video id="vid" src="http://trailers.apple.com/movies/weinstein/submarine/submarine-tlr1_480p.mov" height="391"  + controls preload="metadata"> + </video> + </p> + <p> + <button id="controls" onclick="preload('none')">preload=none</button> + <button id="controls" onclick="preload('metadata')">preload=metadata</button> + <button id="controls" onclick="preload('auto')">preload=auto</button> + </p> + + <div class="info"> + <input id="querymovie" type="button" value="Refresh" onclick="querymovie()"> + <br> + <table> + <tbody> + <tr><td>Preload</td><td id="Preload"></td></tr> + <tr><td>Error</td><td id="Error"></td></tr> + <tr><td>Duration</td> <td id="Duration"></td></tr> + <tr><td>Video Width</td><td id="Video Width"></td></tr> + <tr><td>Video Height</td><td id="Video Height"></td></tr> + <tr><td>Default Playback Rate</td><td id="Default Playback Rate"></td></tr> + <tr><td>Volume</td><td id="Volume"></td></tr> + <tr><td>Ready State</td><td id="Ready State"></td></tr> + <tr><td>Network State</td><td id="Network State"></td></tr> + <tr><td>Max time buffered</td><td id="Max time buffered"></td></tr> + <tr><td>Max time seekable</td><td id="Max time seekable"></td></tr> + <tr><td>Source</td><td id="Source"></td></tr> + <tr><td>Current Source </td> <td id="Current Source"></td></tr> + </tbody> + </table> + </div> + + <br> + <div class="info"> + Enter a url:<input type="text" size="90" maxlength="2048" onchange="setURL(this.value)" > + <br> + <input id="clear_log" type="button" value="Clear" onclick="clearlog()">  + <input type="checkbox" id="log-progress"> log 'progress' events + <input type="checkbox" checked id="log-timeupdate"> log 'timeupdate' events + <textarea rows=30 cols=30 id=event_log></textarea> + <div id="event_log"></div> + </div> + +</body> +</html> 
diff --git a/ManualTests/media-elements/video-replaces-poster.html b/ManualTests/media-elements/video-replaces-poster.html new file mode 100644 index 0000000..bf91a39 --- /dev/null +++ b/ManualTests/media-elements/video-replaces-poster.html 
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> + <head> + </head> + <body> + <p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=34965">https://bugs.webkit.org/show_bug.cgi?id=34965</a><br> + Disable accelerated compositing and reload this test. You should see the test video + start playing.</p> + + <video width="480" height="270" type="video/mp4" + src="../../../../LayoutTests/media/content/test.mp4" + poster="../../../../LayoutTests/media/content/abe.png" autoplay> + </video> + </body> +</html> 
diff --git a/ManualTests/media-muted.html b/ManualTests/media-muted.html new file mode 100644 index 0000000..40e4e41 --- /dev/null +++ b/ManualTests/media-muted.html 
@@ -0,0 +1,32 @@ +<html> + <!-- LayoutTests location is hard-coded to avoid duplication of code. --> + <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script> + <script> + var vid; + + function canplaythrough() + { + vid.play(); + } + + function load() + { + vid = document.getElementById('vid'); + vid.addEventListener('canplaythrough', canplaythrough); + + // Mute first + vid.muted = true; + + vid.src = "http://src.chromium.org/svn/trunk/src/chrome/test/data/media/" + findMediaFile("video", "bear"); + } + </script> + + <body> + <video id=vid controls autoplay> + </video> + <p>TEST: Video should be muted (e.g., controls) and also produce no sound (<a href="https://bugs.webkit.org/show_bug.cgi?id=57673">bug 57673</a>).</p> + <input type="button" value="Load movie" onclick="load()"> + <br> + </body> + +</html> 
diff --git a/ManualTests/media-players-are-dropped-on-error.html b/ManualTests/media-players-are-dropped-on-error.html new file mode 100644 index 0000000..0389668 --- /dev/null +++ b/ManualTests/media-players-are-dropped-on-error.html 
@@ -0,0 +1,40 @@ +<html> +<head> +<script> +var urls = [ + "file:///does not exist oh noes/test.mp4", + "../LayoutTests/media/content/test-25fps.mp4" +]; +var kickoffFunctions = [ + "load", + "play" +]; + +var mediaElementHolder = []; + +function releaseAndAddMediaElements() { + for (var i = 0; i < mediaElementHolder.length; ++i) + mediaElementHolder[i].src = ""; + mediaElementHolder = []; + + for (var i = 0; i < 5; ++i) { + for (var url in urls) { + for (var kickoffFunction in kickoffFunctions) { + var a = document.createElement('video'); + a.controls = "controls"; + a.src = urls[url]; + eval("a." + kickoffFunctions[kickoffFunction] + "();"); + mediaElementHolder.push(a); + } + } + } +} +</script> +</head> +<body onload="setInterval('releaseAndAddMediaElements()', 100)"> + Test that media players aren't leaked on error. + Load this page and verify the number of threads used by the browser doesn't + seem unreasonable (e.g. chrome uses 4-5 threads per video tag so staying + under 100 threads is "success", since this instantiates 20 &lt;video&gt; elements). +</body> +</html> 
diff --git a/ManualTests/memory/MessageUidsAlreadyDownloaded2 b/ManualTests/memory/MessageUidsAlreadyDownloaded2 new file mode 100644 index 0000000..57269f6 --- /dev/null +++ b/ManualTests/memory/MessageUidsAlreadyDownloaded2 
@@ -0,0 +1,4296 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +	<key>1154111803.H358449P19268.mbox1.freenet.de,S=22050,L=363</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-28T19:13:46Z</date> +	</dict> +	<key>1154117771.H461347P398.mbox1.freenet.de,S=2443,L=89</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-28T20:22:43Z</date> +	</dict> +	<key>1154118461.H845954P11540.mbox1.freenet.de,S=2073,L=60</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-28T20:34:37Z</date> +	</dict> +	<key>1154119399.H723288P24749.mbox1.freenet.de,S=3784,L=75</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:48Z</date> +	</dict> +	<key>1154120527.H499834P7002.mbox1.freenet.de,S=2428,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:49Z</date> +	</dict> +	<key>1154136928.H711235P7432.mbox1.freenet.de,S=2267,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:55Z</date> +	</dict> +	<key>1154141115.H278014P21772.mbox1.freenet.de,S=2648,L=94</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:55Z</date> +	</dict> +	<key>1154142404.H444143P13254.mbox1.freenet.de,S=26736,L=481</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:55Z</date> +	</dict> +	<key>1154143048.H4813P29876.mbox1.freenet.de,S=2432,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:55Z</date> +	</dict> +	<key>1154146079.H240331P27863.mbox1.freenet.de,S=3336,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:58Z</date> +	</dict> +	<key>1154148315.H16116P16385.mbox1.freenet.de,S=1973,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:17:58Z</date> +	</dict> +	<key>1154155911.H447952P8367.mbox1.freenet.de,S=9377,L=175</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:58:04Z</date> +	</dict> +	<key>1154156262.H931482P16302.mbox1.freenet.de,S=1467,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T06:58:04Z</date> +	</dict> +	<key>1154157562.H280906P1236.mbox1.freenet.de,S=35699,L=546</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T08:17:58Z</date> +	</dict> +	<key>1154157648.H144803P2338.mbox1.freenet.de,S=22613,L=370</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T08:17:58Z</date> +	</dict> +	<key>1154160958.H795942P22086.mbox1.freenet.de,S=2829,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T08:17:58Z</date> +	</dict> +	<key>1154164698.H624491P18335.mbox1.freenet.de,S=43702,L=1023</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:45Z</date> +	</dict> +	<key>1154167515.H972702P5030.mbox1.freenet.de,S=22467,L=368</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:46Z</date> +	</dict> +	<key>1154174670.H224050P30725.mbox1.freenet.de,S=3308,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:47Z</date> +	</dict> +	<key>1154176114.H743456P22579.mbox1.freenet.de,S=2006,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:47Z</date> +	</dict> +	<key>1154184971.H479935P25330.mbox1.freenet.de,S=2635,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:47Z</date> +	</dict> +	<key>1154185677.H789066P3851.mbox1.freenet.de,S=1167,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:14:47Z</date> +	</dict> +	<key>1154190799.H30721P17126.mbox1.freenet.de,S=3783,L=75</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T16:35:31Z</date> +	</dict> +	<key>1154194034.H891700P4354.mbox1.freenet.de,S=2153,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T17:35:31Z</date> +	</dict> +	<key>1154198323.H243017P9092.mbox1.freenet.de,S=1500,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T18:56:10Z</date> +	</dict> +	<key>1154201448.H521281P30530.mbox1.freenet.de,S=3766,L=110</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T19:35:34Z</date> +	</dict> +	<key>1154201733.H742067P3354.mbox1.freenet.de,S=1374,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T19:35:34Z</date> +	</dict> +	<key>1154202656.H351645P17823.mbox1.freenet.de,S=22871,L=370</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T19:55:49Z</date> +	</dict> +	<key>1154206406.H789099P8315.mbox1.freenet.de,S=1975,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T21:11:07Z</date> +	</dict> +	<key>1154207701.H462086P24032.mbox1.freenet.de,S=2628,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-29T21:54:47Z</date> +	</dict> +	<key>1154211428.H139331P11450.mbox1.freenet.de,S=1978,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:37Z</date> +	</dict> +	<key>1154211730.H16038P14828.mbox1.freenet.de,S=7500,L=226</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:39Z</date> +	</dict> +	<key>1154221130.H326563P6974.mbox1.freenet.de,S=2771,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:39Z</date> +	</dict> +	<key>1154222657.H751377P30045.mbox1.freenet.de,S=2197,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:39Z</date> +	</dict> +	<key>1154226264.H252785P28758.mbox1.freenet.de,S=2933,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:39Z</date> +	</dict> +	<key>1154230453.H837438P7526.mbox1.freenet.de,S=3571,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154236571.H729085P28582.mbox1.freenet.de,S=2807,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154236783.H955292P30199.mbox1.freenet.de,S=2188,L=62</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154242354.H170494P14687.mbox1.freenet.de,S=9625,L=63</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154242855.H757856P18626.mbox1.freenet.de,S=2672,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154244551.H920942P2192.mbox1.freenet.de,S=2207,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T07:32:41Z</date> +	</dict> +	<key>1154263532.H193325P22924.mbox1.freenet.de,S=2039,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T12:46:38Z</date> +	</dict> +	<key>1154265275.H367713P16996.mbox1.freenet.de,S=2198,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-07-30T13:16:47Z</date> +	</dict> +	<key>1154282347.H20977P3823.mbox1.freenet.de,S=9587,L=199</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:16Z</date> +	</dict> +	<key>1154288804.H803763P8206.mbox1.freenet.de,S=2058,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:17Z</date> +	</dict> +	<key>1154299820.H477576P18033.mbox1.freenet.de,S=2618,L=93</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:18Z</date> +	</dict> +	<key>1154310315.H820113P1827.mbox1.freenet.de,S=3799,L=110</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:19Z</date> +	</dict> +	<key>1154311499.H546032P13891.mbox1.freenet.de,S=2233,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:19Z</date> +	</dict> +	<key>1154318224.H536896P14968.mbox1.freenet.de,S=8805,L=157</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154319854.H210142P26288.mbox1.freenet.de,S=2446,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154321361.H711271P5428.mbox1.freenet.de,S=2036,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154322532.H550166P17256.mbox1.freenet.de,S=3144,L=110</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154325187.H294135P17861.mbox1.freenet.de,S=3459,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154330389.H180134P593.mbox1.freenet.de,S=2768,L=94</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154330589.H853877P3916.mbox1.freenet.de,S=2048,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154330917.H159606P9329.mbox1.freenet.de,S=28506,L=562</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154335492.H583581P30769.mbox1.freenet.de,S=3134,L=110</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154339191.H120444P8465.mbox1.freenet.de,S=3063,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154339572.H788076P15350.mbox1.freenet.de,S=1586,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:22Z</date> +	</dict> +	<key>1154341116.H784100P13474.mbox1.freenet.de,S=9493,L=69</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154350115.H216883P8871.mbox1.freenet.de,S=3376,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154352077.H598131P13951.mbox1.freenet.de,S=2053,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154357533.H427278P29986.mbox1.freenet.de,S=5214,L=126</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154368111.H681374P21908.mbox1.freenet.de,S=3384,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154372487.H589212P18160.mbox1.freenet.de,S=1805,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154373426.H113666P5693.mbox1.freenet.de,S=1955,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:23Z</date> +	</dict> +	<key>1154374064.H646622P19789.mbox1.freenet.de,S=16327,L=260</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154374390.H822597P26688.mbox1.freenet.de,S=29058,L=568</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154374877.H443661P8856.mbox1.freenet.de,S=7478,L=144</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154378335.H372820P17205.mbox1.freenet.de,S=29708,L=578</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154380198.H919219P16039.mbox1.freenet.de,S=1617,L=41</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154380266.H829510P17338.mbox1.freenet.de,S=3159,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154381245.H781041P971.mbox1.freenet.de,S=29486,L=573</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154383826.H581519P5619.mbox1.freenet.de,S=2491,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154383907.H914484P6602.mbox1.freenet.de,S=2579,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154389136.H486057P2884.mbox1.freenet.de,S=18921,L=508</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154406313.H251951P16905.mbox1.freenet.de,S=8234,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154406403.H74248P17793.mbox1.freenet.de,S=1468,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154406904.H284040P25564.mbox1.freenet.de,S=1328,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154410875.H702423P10666.mbox1.freenet.de,S=3436,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154411027.H712871P13320.mbox1.freenet.de,S=2299,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:27Z</date> +	</dict> +	<key>1154412960.H909004P13832.mbox1.freenet.de,S=3304,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154423513.H859512P10214.mbox1.freenet.de,S=2261,L=66</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154432726.H69271P12439.mbox1.freenet.de,S=1774,L=41</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154433859.H266614P4663.mbox1.freenet.de,S=61054,L=790</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154437434.H599023P17039.mbox1.freenet.de,S=3191,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154446410.H329415P18075.mbox1.freenet.de,S=1871,L=41</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154446719.H706064P27099.mbox1.freenet.de,S=1666,L=40</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154452994.H219957P9909.mbox1.freenet.de,S=3768,L=109</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154456797.H410486P5536.mbox1.freenet.de,S=3808,L=112</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:30Z</date> +	</dict> +	<key>1154458368.H152307P9225.mbox1.freenet.de,S=2298,L=46</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154459822.H574797P13606.mbox1.freenet.de,S=2294,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154462619.H765747P10024.mbox1.freenet.de,S=2075,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154464640.H274928P18932.mbox1.freenet.de,S=2051,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154467696.H267955P13501.mbox1.freenet.de,S=26182,L=563</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154467775.H548080P14727.mbox1.freenet.de,S=29184,L=578</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154470343.H767624P26215.mbox1.freenet.de,S=2613,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154479256.H884595P18388.mbox1.freenet.de,S=17010,L=293</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154479329.H790239P19426.mbox1.freenet.de,S=29841,L=576</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154482204.H318144P19613.mbox1.freenet.de,S=2919,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154492754.H490902P13765.mbox1.freenet.de,S=3224,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154496852.H422665P22937.mbox1.freenet.de,S=2168,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154500305.H761267P3003.mbox1.freenet.de,S=2055,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:34Z</date> +	</dict> +	<key>1154502841.H481665P7299.mbox1.freenet.de,S=9029,L=158</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154503390.H907552P21594.mbox1.freenet.de,S=1355,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154506274.H963865P12453.mbox1.freenet.de,S=1538,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154507112.H636295P4391.mbox1.freenet.de,S=1545,L=41</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154510432.H500772P6353.mbox1.freenet.de,S=8098,L=136</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154510812.H930961P17880.mbox1.freenet.de,S=3269,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154511935.H742983P21884.mbox1.freenet.de,S=4303,L=63</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154518569.H771158P3018.mbox1.freenet.de,S=3228,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154518727.H778942P8528.mbox1.freenet.de,S=7727,L=181</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154525091.H309996P14768.mbox1.freenet.de,S=1577,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154527275.H61884P18991.mbox1.freenet.de,S=1629,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154528083.H278774P12141.mbox1.freenet.de,S=3469,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154531670.H161741P576.mbox1.freenet.de,S=17904,L=307</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154540694.H424930P11508.mbox1.freenet.de,S=2100,L=46</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154541967.H480715P24795.mbox1.freenet.de,S=34667,L=1135</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154544700.H204133P16065.mbox1.freenet.de,S=7518,L=177</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154545974.H878571P10429.mbox1.freenet.de,S=17643,L=304</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154547134.H790776P6068.mbox1.freenet.de,S=2129,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154547134.H791582P6082.mbox1.freenet.de,S=2109,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154552079.H183013P26609.mbox1.freenet.de,S=1557,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:37Z</date> +	</dict> +	<key>1154558833.H680601P19873.mbox1.freenet.de,S=29014,L=565</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154559443.H629394P27069.mbox1.freenet.de,S=28201,L=565</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154559705.H963621P30624.mbox1.freenet.de,S=1658,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154559903.H128255P635.mbox1.freenet.de,S=4293,L=115</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154561841.H24917P22788.mbox1.freenet.de,S=1678,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154565078.H552095P24820.mbox1.freenet.de,S=1571,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154567656.H888068P19790.mbox1.freenet.de,S=28626,L=565</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154577271.H344493P18097.mbox1.freenet.de,S=2687,L=94</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154581483.H783928P29693.mbox1.freenet.de,S=1956,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154592204.H40007P17630.mbox1.freenet.de,S=1723,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154596091.H624074P1470.mbox1.freenet.de,S=1771,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154596322.H41452P6095.mbox1.freenet.de,S=3290,L=93</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154596653.H393287P14440.mbox1.freenet.de,S=1662,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154602697.H48510P21068.mbox1.freenet.de,S=3294,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154610123.H590789P10560.mbox1.freenet.de,S=5389,L=140</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154611988.H804047P20437.mbox1.freenet.de,S=15159,L=234</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154620474.H342588P28635.mbox1.freenet.de,S=8578,L=239</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154624033.H534525P3741.mbox1.freenet.de,S=3097,L=109</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154624721.H847487P16221.mbox1.freenet.de,S=1666,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154625169.H409170P24163.mbox1.freenet.de,S=1810,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:41Z</date> +	</dict> +	<key>1154630617.H489240P18189.mbox1.freenet.de,S=15420,L=449</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154630832.H617668P26506.mbox1.freenet.de,S=3275,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154632455.H73886P5468.mbox1.freenet.de,S=41479,L=739</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154636004.H213292P11542.mbox1.freenet.de,S=2073,L=43</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154648684.H553339P9249.mbox1.freenet.de,S=1283,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154654111.H342601P28367.mbox1.freenet.de,S=1749,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154654548.H92597P32115.mbox1.freenet.de,S=1582,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154663797.H236313P19106.mbox1.freenet.de,S=3212,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154666007.H220170P15121.mbox1.freenet.de,S=2399,L=60</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154674137.H953239P18937.mbox1.freenet.de,S=1780,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154674539.H433913P29115.mbox1.freenet.de,S=1726,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154678097.H775074P29674.mbox1.freenet.de,S=2118,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154681470.H721664P30619.mbox1.freenet.de,S=1653,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154681835.H440294P5887.mbox1.freenet.de,S=3303,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154683329.H499060P3008.mbox1.freenet.de,S=2973,L=107</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154683349.H475784P3421.mbox1.freenet.de,S=1635,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154684133.H456313P20424.mbox1.freenet.de,S=16757,L=398</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154686227.H264355P3267.mbox1.freenet.de,S=5053,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154693255.H104812P23648.mbox1.freenet.de,S=3269,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154701385.H313603P24878.mbox1.freenet.de,S=1747,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154706438.H888975P28377.mbox1.freenet.de,S=8804,L=156</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154709564.H133555P12044.mbox1.freenet.de,S=1687,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154711177.H804272P9516.mbox1.freenet.de,S=3008,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154711962.H906792P24181.mbox1.freenet.de,S=1714,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:45Z</date> +	</dict> +	<key>1154712249.H863087P31306.mbox1.freenet.de,S=1346,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154713540.H686084P26445.mbox1.freenet.de,S=1553,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154713751.H55777P30321.mbox1.freenet.de,S=1656,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154714170.H614557P4421.mbox1.freenet.de,S=3281,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154718674.H962131P20772.mbox1.freenet.de,S=2187,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154736338.H750416P22092.mbox1.freenet.de,S=1653,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154737824.H694419P4946.mbox1.freenet.de,S=3256,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154739519.H564665P7297.mbox1.freenet.de,S=1480,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154742580.H145981P16735.mbox1.freenet.de,S=3083,L=109</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154748952.H268713P25433.mbox1.freenet.de,S=1582,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154762163.H879963P5656.mbox1.freenet.de,S=1743,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154762709.H416283P12536.mbox1.freenet.de,S=36151,L=651</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154764703.H681259P13907.mbox1.freenet.de,S=5585,L=142</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154765905.H451651P2578.mbox1.freenet.de,S=1823,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154769448.H539772P24732.mbox1.freenet.de,S=30509,L=579</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154771241.H958339P23393.mbox1.freenet.de,S=2643,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154771454.H867661P26915.mbox1.freenet.de,S=3250,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154772483.H759921P10662.mbox1.freenet.de,S=31161,L=584</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154774590.H735607P14785.mbox1.freenet.de,S=1349,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154780998.H350794P2186.mbox1.freenet.de,S=1476,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154783729.H629301P24338.mbox1.freenet.de,S=1828,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154787802.H457991P5386.mbox1.freenet.de,S=1693,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:48Z</date> +	</dict> +	<key>1154793287.H907122P26499.mbox1.freenet.de,S=1979,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154796083.H582751P18038.mbox1.freenet.de,S=3393,L=94</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154800164.H457883P20118.mbox1.freenet.de,S=1586,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154802791.H175746P2813.mbox1.freenet.de,S=32753,L=593</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154807187.H620176P8421.mbox1.freenet.de,S=2249,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154808376.H73702P29758.mbox1.freenet.de,S=31175,L=583</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154815352.H547663P23781.mbox1.freenet.de,S=2226,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154815852.H497641P28672.mbox1.freenet.de,S=1640,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154819844.H89068P3941.mbox1.freenet.de,S=1629,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154824220.H394534P13505.mbox1.freenet.de,S=3228,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154825688.H313706P30527.mbox1.freenet.de,S=1339,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154833081.H437178P7263.mbox1.freenet.de,S=1671,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154834629.H62247P20542.mbox1.freenet.de,S=32275,L=589</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154834996.H616625P23803.mbox1.freenet.de,S=2314,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154835617.H514035P28790.mbox1.freenet.de,S=32395,L=590</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:51Z</date> +	</dict> +	<key>1154838795.H268666P26334.mbox1.freenet.de,S=3237,L=112</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154842431.H758835P9655.mbox1.freenet.de,S=1859,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154842671.H909620P13204.mbox1.freenet.de,S=1899,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154845999.H991416P17794.mbox1.freenet.de,S=1522,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154847930.H731674P21637.mbox1.freenet.de,S=1682,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154850230.H929566P13366.mbox1.freenet.de,S=2687,L=70</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154853778.H392687P27949.mbox1.freenet.de,S=1510,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154858210.H631452P8577.mbox1.freenet.de,S=1949,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154866627.H35308P2473.mbox1.freenet.de,S=2118,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154870895.H472229P15808.mbox1.freenet.de,S=1666,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154873038.H830117P19580.mbox1.freenet.de,S=1821,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T14:33:52Z</date> +	</dict> +	<key>1154874938.H570736P20318.mbox1.freenet.de,S=9402,L=195</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T17:16:29Z</date> +	</dict> +	<key>1154879259.H913434P702.mbox1.freenet.de,S=5899,L=123</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T17:16:29Z</date> +	</dict> +	<key>1154892728.H872013P14934.mbox1.freenet.de,S=8171,L=176</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T20:03:30Z</date> +	</dict> +	<key>1154893187.H782991P23768.mbox1.freenet.de,S=2273,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T20:03:33Z</date> +	</dict> +	<key>1154896088.H57751P7859.mbox1.freenet.de,S=1746,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-06T20:29:21Z</date> +	</dict> +	<key>1154897034.H715417P27754.mbox1.freenet.de,S=1355,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:32Z</date> +	</dict> +	<key>1154897842.H192629P9304.mbox1.freenet.de,S=1775,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:34Z</date> +	</dict> +	<key>1154908466.H256444P4309.mbox1.freenet.de,S=9612,L=202</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:34Z</date> +	</dict> +	<key>1154913087.H603613P15691.mbox1.freenet.de,S=3458,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:34Z</date> +	</dict> +	<key>1154921729.H699962P10129.mbox1.freenet.de,S=32365,L=590</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154925637.H501014P19587.mbox1.freenet.de,S=2030,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154926530.H205520P969.mbox1.freenet.de,S=1497,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154928611.H397993P27462.mbox1.freenet.de,S=1781,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154930612.H415665P22794.mbox1.freenet.de,S=1608,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154931196.H488624P31905.mbox1.freenet.de,S=31260,L=582</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:15:36Z</date> +	</dict> +	<key>1154933559.H443205P4635.mbox1.freenet.de,S=6551340,L=85105</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T06:58:36Z</date> +	</dict> +	<key>1154938322.H156182P23187.mbox1.freenet.de,S=2208,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T10:43:42Z</date> +	</dict> +	<key>1154939863.H828842P20902.mbox1.freenet.de,S=1646,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T10:43:43Z</date> +	</dict> +	<key>1154944050.H239620P3977.mbox1.freenet.de,S=1614,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T10:43:43Z</date> +	</dict> +	<key>1154944762.H411027P17426.mbox1.freenet.de,S=3329,L=93</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T10:43:43Z</date> +	</dict> +	<key>1154946936.H546750P29015.mbox1.freenet.de,S=16127,L=450</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T10:43:43Z</date> +	</dict> +	<key>1154950715.H932658P9753.mbox1.freenet.de,S=3123,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T11:44:24Z</date> +	</dict> +	<key>1154955826.H244494P25346.mbox1.freenet.de,S=1815,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T13:33:31Z</date> +	</dict> +	<key>1154956871.H53807P29765.mbox1.freenet.de,S=1631,L=49</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T13:33:31Z</date> +	</dict> +	<key>1154961414.H983301P10603.mbox1.freenet.de,S=3053,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T14:39:43Z</date> +	</dict> +	<key>1154964711.H449025P23281.mbox1.freenet.de,S=5168,L=133</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T15:39:27Z</date> +	</dict> +	<key>1154969887.H902776P18126.mbox1.freenet.de,S=3227,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T18:29:33Z</date> +	</dict> +	<key>1154973242.H36323P30035.mbox1.freenet.de,S=1313,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T18:29:33Z</date> +	</dict> +	<key>1154978298.H254629P25143.mbox1.freenet.de,S=33034,L=597</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T19:42:39Z</date> +	</dict> +	<key>1154979552.H889611P20200.mbox1.freenet.de,S=2261,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T19:42:39Z</date> +	</dict> +	<key>1154980568.H271316P9540.mbox1.freenet.de,S=31898,L=588</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T20:17:30Z</date> +	</dict> +	<key>1154981484.H87054P30587.mbox1.freenet.de,S=1497,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T20:17:31Z</date> +	</dict> +	<key>1154981702.H412110P4514.mbox1.freenet.de,S=8573,L=154</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T20:17:31Z</date> +	</dict> +	<key>1154981870.H420131P9009.mbox1.freenet.de,S=1651,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T20:26:09Z</date> +	</dict> +	<key>1154982355.H370141P21708.mbox1.freenet.de,S=1428,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T20:26:09Z</date> +	</dict> +	<key>1154984295.H419999P24736.mbox1.freenet.de,S=1710,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-07T21:02:39Z</date> +	</dict> +	<key>1154986457.H837808P23722.mbox1.freenet.de,S=1762,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:56Z</date> +	</dict> +	<key>1154989237.H324641P29504.mbox1.freenet.de,S=1665,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1154995803.H199883P16986.mbox1.freenet.de,S=3240,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155007768.H677900P17429.mbox1.freenet.de,S=3429,L=106</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155012524.H237704P28385.mbox1.freenet.de,S=1690,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155015722.H329094P31095.mbox1.freenet.de,S=1598,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155017688.H202986P2108.mbox1.freenet.de,S=2416,L=64</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155019544.H171597P31071.mbox1.freenet.de,S=14875,L=204</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T07:11:57Z</date> +	</dict> +	<key>1155021858.H445423P4116.mbox1.freenet.de,S=2196,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T08:06:11Z</date> +	</dict> +	<key>1155026416.H676559P25807.mbox1.freenet.de,S=4593,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T09:07:42Z</date> +	</dict> +	<key>1155026481.H855058P27126.mbox1.freenet.de,S=1880,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T09:07:42Z</date> +	</dict> +	<key>1155031071.H398485P26147.mbox1.freenet.de,S=14897,L=204</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T11:24:37Z</date> +	</dict> +	<key>1155034969.H2428P30391.mbox1.freenet.de,S=159386,L=2162</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T11:24:38Z</date> +	</dict> +	<key>1155038195.H291065P15043.mbox1.freenet.de,S=1987,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T12:28:23Z</date> +	</dict> +	<key>1155038654.H448775P28113.mbox1.freenet.de,S=1691,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T12:28:23Z</date> +	</dict> +	<key>1155039123.H590017P6572.mbox1.freenet.de,S=3229,L=90</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T12:28:23Z</date> +	</dict> +	<key>1155039545.H801292P14681.mbox1.freenet.de,S=1715,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T12:28:23Z</date> +	</dict> +	<key>1155041106.H6125P17272.mbox1.freenet.de,S=25559,L=395</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T13:41:32Z</date> +	</dict> +	<key>1155047666.H906085P12577.mbox1.freenet.de,S=2136,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T14:39:06Z</date> +	</dict> +	<key>1155050012.H159989P29286.mbox1.freenet.de,S=1652,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:30Z</date> +	</dict> +	<key>1155050208.H193791P1203.mbox1.freenet.de,S=1683,L=40</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:30Z</date> +	</dict> +	<key>1155050754.H895485P13244.mbox1.freenet.de,S=1761,L=41</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:30Z</date> +	</dict> +	<key>1155054454.H613144P13074.mbox1.freenet.de,S=14663,L=205</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:30Z</date> +	</dict> +	<key>1155056216.H853320P28840.mbox1.freenet.de,S=1562,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:31Z</date> +	</dict> +	<key>1155060313.H287349P23272.mbox1.freenet.de,S=14987,L=206</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:31Z</date> +	</dict> +	<key>1155066043.H154047P5837.mbox1.freenet.de,S=1627,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-08T19:47:31Z</date> +	</dict> +	<key>1155071351.H344743P26441.mbox1.freenet.de,S=3238,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T06:51:24Z</date> +	</dict> +	<key>1155075396.H2838P11152.mbox1.freenet.de,S=2242,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T06:51:24Z</date> +	</dict> +	<key>1155087979.H908982P472.mbox1.freenet.de,S=3206,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T06:51:24Z</date> +	</dict> +	<key>1155102590.H596945P18125.mbox1.freenet.de,S=1665,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T06:51:24Z</date> +	</dict> +	<key>1155105219.H245947P23254.mbox1.freenet.de,S=1691,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T06:51:24Z</date> +	</dict> +	<key>1155114184.H181845P9641.mbox1.freenet.de,S=1365,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:40Z</date> +	</dict> +	<key>1155116990.H948623P3005.mbox1.freenet.de,S=1483,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:46Z</date> +	</dict> +	<key>1155121665.H11872P25431.mbox1.freenet.de,S=2077,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:46Z</date> +	</dict> +	<key>1155121962.H936848P2813.mbox1.freenet.de,S=3159,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:46Z</date> +	</dict> +	<key>1155122252.H501745P12050.mbox1.freenet.de,S=21210,L=353</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:46Z</date> +	</dict> +	<key>1155125174.H102411P11794.mbox1.freenet.de,S=1882,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:29:46Z</date> +	</dict> +	<key>1155127037.H36718P9860.mbox1.freenet.de,S=5025,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T12:47:47Z</date> +	</dict> +	<key>1155129246.H357155P25173.mbox1.freenet.de,S=28808,L=427</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T13:17:20Z</date> +	</dict> +	<key>1155134270.H946819P22490.mbox1.freenet.de,S=3105,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T15:38:09Z</date> +	</dict> +	<key>1155137071.H215601P6019.mbox1.freenet.de,S=2153,L=69</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T15:38:10Z</date> +	</dict> +	<key>1155140096.H731141P5353.mbox1.freenet.de,S=27117,L=947</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T19:20:10Z</date> +	</dict> +	<key>1155147435.H883142P16666.mbox1.freenet.de,S=3254,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T19:20:17Z</date> +	</dict> +	<key>1155149346.H483480P3230.mbox1.freenet.de,S=1742,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T19:20:20Z</date> +	</dict> +	<key>1155152041.H89754P29468.mbox1.freenet.de,S=13453,L=186</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T20:08:49Z</date> +	</dict> +	<key>1155152549.H938827P6615.mbox1.freenet.de,S=1654,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T20:08:49Z</date> +	</dict> +	<key>1155155667.H706656P27859.mbox1.freenet.de,S=1670,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T21:04:16Z</date> +	</dict> +	<key>1155155721.H806685P29134.mbox1.freenet.de,S=1723,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T21:04:17Z</date> +	</dict> +	<key>1155155861.H55151P32242.mbox1.freenet.de,S=1457,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T21:04:17Z</date> +	</dict> +	<key>1155156698.H850532P19416.mbox1.freenet.de,S=13623,L=186</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-09T21:04:17Z</date> +	</dict> +	<key>1155159422.H265424P29763.mbox1.freenet.de,S=5487,L=143</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:11Z</date> +	</dict> +	<key>1155161221.H794333P25451.mbox1.freenet.de,S=3397,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155167903.H387503P8670.mbox1.freenet.de,S=5102,L=130</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155178649.H955288P12079.mbox1.freenet.de,S=3277,L=93</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155186315.H470476P5661.mbox1.freenet.de,S=3487,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155186658.H670900P15406.mbox1.freenet.de,S=1989,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155186997.H18542P21862.mbox1.freenet.de,S=2150,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155187306.H580672P27067.mbox1.freenet.de,S=2039,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T06:41:12Z</date> +	</dict> +	<key>1155199565.H850171P22348.mbox1.freenet.de,S=1390,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:28Z</date> +	</dict> +	<key>1155200503.H856923P16842.mbox1.freenet.de,S=1755,L=60</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155205799.H539866P8747.mbox1.freenet.de,S=1448,L=32</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155210205.H954514P4886.mbox1.freenet.de,S=5059,L=130</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155211504.H549185P762.mbox1.freenet.de,S=3250,L=92</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155219619.H759780P2552.mbox1.freenet.de,S=1373,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155224527.H270710P25060.mbox1.freenet.de,S=7736,L=305</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:29Z</date> +	</dict> +	<key>1155226024.H400337P22956.mbox1.freenet.de,S=34091,L=713</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:30Z</date> +	</dict> +	<key>1155230782.H443448P26737.mbox1.freenet.de,S=13144,L=186</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-10T18:48:30Z</date> +	</dict> +	<key>1155243694.H163572P15822.mbox1.freenet.de,S=5506,L=143</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:06Z</date> +	</dict> +	<key>1155244054.H318166P26053.mbox1.freenet.de,S=1531,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155246379.H408080P2400.mbox1.freenet.de,S=2226,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155248794.H746051P3848.mbox1.freenet.de,S=2052,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155250978.H781606P2109.mbox1.freenet.de,S=1601,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155251595.H386382P13425.mbox1.freenet.de,S=1574,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155252375.H816725P24987.mbox1.freenet.de,S=1577,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155253496.H489745P3333.mbox1.freenet.de,S=3120,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155263997.H396439P1002.mbox1.freenet.de,S=1640,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155267607.H85281P31359.mbox1.freenet.de,S=13158,L=185</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155268846.H494747P10094.mbox1.freenet.de,S=1951,L=40</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155271169.H140042P28629.mbox1.freenet.de,S=2760,L=97</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155274958.H592129P2743.mbox1.freenet.de,S=16365,L=260</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155278275.H114040P11873.mbox1.freenet.de,S=1723,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T07:02:15Z</date> +	</dict> +	<key>1155288724.H433494P24215.mbox1.freenet.de,S=3220,L=91</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T10:26:06Z</date> +	</dict> +	<key>1155293569.H411195P21139.mbox1.freenet.de,S=2721,L=76</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T11:11:15Z</date> +	</dict> +	<key>1155295204.H811233P22677.mbox1.freenet.de,S=1621,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T11:21:09Z</date> +	</dict> +	<key>1155296029.H99298P8943.mbox1.freenet.de,S=5011,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T11:55:47Z</date> +	</dict> +	<key>1155297301.H522378P5338.mbox1.freenet.de,S=19298,L=303</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T11:55:47Z</date> +	</dict> +	<key>1155297492.H795867P9124.mbox1.freenet.de,S=1373,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T12:01:07Z</date> +	</dict> +	<key>1155300909.H622250P20310.mbox1.freenet.de,S=194228,L=2683</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T12:55:49Z</date> +	</dict> +	<key>1155308792.H250936P22936.mbox1.freenet.de,S=2028,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T15:10:52Z</date> +	</dict> +	<key>1155309026.H629799P28442.mbox1.freenet.de,S=1621,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T15:10:52Z</date> +	</dict> +	<key>1155312703.H180117P16780.mbox1.freenet.de,S=13163,L=186</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-11T17:01:07Z</date> +	</dict> +	<key>1155341164.H110377P27980.mbox1.freenet.de,S=1470,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:14Z</date> +	</dict> +	<key>1155341478.H462941P2015.mbox1.freenet.de,S=1599,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155342793.H314697P19120.mbox1.freenet.de,S=1724,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155343779.H48544P30268.mbox1.freenet.de,S=3201,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155344116.H268158P7799.mbox1.freenet.de,S=1411,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155354546.H561532P28675.mbox1.freenet.de,S=1371,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155356696.H995990P11509.mbox1.freenet.de,S=1764,L=40</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155358818.H814534P27494.mbox1.freenet.de,S=2888,L=98</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T05:57:17Z</date> +	</dict> +	<key>1155362721.H710518P1102.mbox1.freenet.de,S=2762,L=74</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T06:07:28Z</date> +	</dict> +	<key>1155365332.H325159P29525.mbox1.freenet.de,S=1739,L=62</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T06:54:55Z</date> +	</dict> +	<key>1155372108.H319445P16165.mbox1.freenet.de,S=2708,L=62</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T08:46:45Z</date> +	</dict> +	<key>1155375874.H230704P3857.mbox1.freenet.de,S=2622,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T09:46:48Z</date> +	</dict> +	<key>1155381212.H468458P6801.mbox1.freenet.de,S=1936,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T11:52:04Z</date> +	</dict> +	<key>1155381681.H552427P18977.mbox1.freenet.de,S=5186,L=133</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T11:52:06Z</date> +	</dict> +	<key>1155382498.H369535P6941.mbox1.freenet.de,S=26692,L=477</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T11:52:06Z</date> +	</dict> +	<key>1155383606.H437045P30481.mbox1.freenet.de,S=1413,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T12:52:04Z</date> +	</dict> +	<key>1155383682.H553821P32262.mbox1.freenet.de,S=1712,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T12:52:04Z</date> +	</dict> +	<key>1155387642.H378906P31137.mbox1.freenet.de,S=1697,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T13:01:56Z</date> +	</dict> +	<key>1155389142.H64410P23467.mbox1.freenet.de,S=2791,L=96</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T14:20:15Z</date> +	</dict> +	<key>1155392313.H278709P4708.mbox1.freenet.de,S=3907,L=106</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T14:20:15Z</date> +	</dict> +	<key>1155392617.H994844P9195.mbox1.freenet.de,S=253915,L=3335</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T14:26:49Z</date> +	</dict> +	<key>1155394744.H831207P10676.mbox1.freenet.de,S=2793,L=104</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:02:13Z</date> +	</dict> +	<key>1155395369.H420233P21087.mbox1.freenet.de,S=36481,L=508</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:11:38Z</date> +	</dict> +	<key>1155395795.H180618P28398.mbox1.freenet.de,S=2038,L=69</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:16:41Z</date> +	</dict> +	<key>1155396396.H370822P4949.mbox1.freenet.de,S=4288,L=118</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:39:54Z</date> +	</dict> +	<key>1155396467.H347908P6065.mbox1.freenet.de,S=1666,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:39:54Z</date> +	</dict> +	<key>1155397346.H746437P19876.mbox1.freenet.de,S=232524,L=3830</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:47:28Z</date> +	</dict> +	<key>1155397550.H814414P23509.mbox1.freenet.de,S=1954,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:47:28Z</date> +	</dict> +	<key>1155397892.H161483P29827.mbox1.freenet.de,S=2137,L=67</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T15:54:14Z</date> +	</dict> +	<key>1155398368.H272840P5908.mbox1.freenet.de,S=1658,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T16:00:17Z</date> +	</dict> +	<key>1155398680.H95312P14345.mbox1.freenet.de,S=5500,L=141</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T16:12:37Z</date> +	</dict> +	<key>1155398690.H251433P14586.mbox1.freenet.de,S=2025,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-12T16:12:37Z</date> +	</dict> +	<key>1155399622.H294694P31838.mbox1.freenet.de,S=1643,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:20Z</date> +	</dict> +	<key>1155401459.H913217P28572.mbox1.freenet.de,S=2554,L=94</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155404891.H231218P23227.mbox1.freenet.de,S=1675,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155408089.H425332P10206.mbox1.freenet.de,S=2251,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155412433.H747029P3760.mbox1.freenet.de,S=1912,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155414118.H534159P31022.mbox1.freenet.de,S=2836,L=97</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155425735.H926302P27336.mbox1.freenet.de,S=1580,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155429421.H583293P26482.mbox1.freenet.de,S=2703,L=96</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:24Z</date> +	</dict> +	<key>1155432697.H707953P20293.mbox1.freenet.de,S=3295,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155442908.H622889P29028.mbox1.freenet.de,S=15653,L=212</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155447888.H964302P4158.mbox1.freenet.de,S=1773,L=60</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155449311.H702848P16196.mbox1.freenet.de,S=2806,L=97</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155452938.H544521P27881.mbox1.freenet.de,S=1319,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155459240.H508185P13192.mbox1.freenet.de,S=1695,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T09:07:27Z</date> +	</dict> +	<key>1155466103.H392282P30143.mbox1.freenet.de,S=2893,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T10:54:42Z</date> +	</dict> +	<key>1155467153.H142108P13986.mbox1.freenet.de,S=1748,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T11:07:41Z</date> +	</dict> +	<key>1155468819.H15840P9570.mbox1.freenet.de,S=5005,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T11:36:45Z</date> +	</dict> +	<key>1155479457.H723406P8075.mbox1.freenet.de,S=2847,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:22Z</date> +	</dict> +	<key>1155482043.H738903P18244.mbox1.freenet.de,S=15708,L=213</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155485750.H781909P19673.mbox1.freenet.de,S=5492,L=139</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155487081.H464166P18373.mbox1.freenet.de,S=1571,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155489196.H263823P4222.mbox1.freenet.de,S=2037,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155489237.H334522P5149.mbox1.freenet.de,S=1672,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155492259.H868827P2084.mbox1.freenet.de,S=2749,L=88</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155494078.H223060P6524.mbox1.freenet.de,S=2068,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155495377.H271409P8759.mbox1.freenet.de,S=2002,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155499124.H310745P21654.mbox1.freenet.de,S=13691,L=203</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-13T20:15:25Z</date> +	</dict> +	<key>1155502236.H453831P28981.mbox1.freenet.de,S=1974,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:16Z</date> +	</dict> +	<key>1155502536.H4863P7134.mbox1.freenet.de,S=3423,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:16Z</date> +	</dict> +	<key>1155504322.H792521P10662.mbox1.freenet.de,S=2113,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:16Z</date> +	</dict> +	<key>1155505529.H281536P26985.mbox1.freenet.de,S=2625,L=87</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:16Z</date> +	</dict> +	<key>1155506205.H322296P1896.mbox1.freenet.de,S=1785,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:16Z</date> +	</dict> +	<key>1155506625.H931796P6990.mbox1.freenet.de,S=1673,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155507649.H402055P18118.mbox1.freenet.de,S=2829,L=73</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155510882.H358588P21362.mbox1.freenet.de,S=15722,L=213</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155510919.H587150P21798.mbox1.freenet.de,S=1632,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155511387.H485218P26769.mbox1.freenet.de,S=2659,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155511644.H820998P29150.mbox1.freenet.de,S=31715,L=537</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155520110.H948986P24237.mbox1.freenet.de,S=3381,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155525640.H835576P13636.mbox1.freenet.de,S=1472,L=32</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155539870.H521633P14256.mbox1.freenet.de,S=3752,L=161</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:24:17Z</date> +	</dict> +	<key>1155540611.H107641P28092.mbox1.freenet.de,S=2791,L=90</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T07:53:33Z</date> +	</dict> +	<key>1155547625.H571328P4725.mbox1.freenet.de,S=6181,L=138</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:37Z</date> +	</dict> +	<key>1155548287.H367423P19149.mbox1.freenet.de,S=2137,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:43Z</date> +	</dict> +	<key>1155554846.H614484P3380.mbox1.freenet.de,S=2672,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:43Z</date> +	</dict> +	<key>1155555174.H616170P9716.mbox1.freenet.de,S=4045,L=114</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:43Z</date> +	</dict> +	<key>1155555283.H376477P12879.mbox1.freenet.de,S=5019,L=130</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:43Z</date> +	</dict> +	<key>1155562611.H618120P10679.mbox1.freenet.de,S=1601,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T14:32:43Z</date> +	</dict> +	<key>1155567178.H899466P23120.mbox1.freenet.de,S=2537,L=85</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T15:32:41Z</date> +	</dict> +	<key>1155571046.H656123P19290.mbox1.freenet.de,S=15656,L=214</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:24Z</date> +	</dict> +	<key>1155572350.H939519P19072.mbox1.freenet.de,S=3646,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155573494.H112844P11809.mbox1.freenet.de,S=10648,L=184</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155573879.H715341P19888.mbox1.freenet.de,S=18996,L=392</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155574584.H945804P2119.mbox1.freenet.de,S=4504,L=121</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155575961.H332723P1198.mbox1.freenet.de,S=1510,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155576490.H541871P15183.mbox1.freenet.de,S=1606,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:25Z</date> +	</dict> +	<key>1155579837.H72419P26294.mbox1.freenet.de,S=2002,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:26Z</date> +	</dict> +	<key>1155583115.H958331P27966.mbox1.freenet.de,S=1784,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:26Z</date> +	</dict> +	<key>1155584199.H239307P14726.mbox1.freenet.de,S=3479,L=108</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T19:57:26Z</date> +	</dict> +	<key>1155586181.H922796P27202.mbox1.freenet.de,S=1683,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T20:25:36Z</date> +	</dict> +	<key>1155588441.H876897P8510.mbox1.freenet.de,S=3823,L=162</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T20:53:00Z</date> +	</dict> +	<key>1155591961.H958739P27676.mbox1.freenet.de,S=8528,L=244</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-14T21:46:26Z</date> +	</dict> +	<key>1155592810.H178870P7600.mbox1.freenet.de,S=2443,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:51Z</date> +	</dict> +	<key>1155594577.H226466P30501.mbox1.freenet.de,S=1377,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:52Z</date> +	</dict> +	<key>1155594767.H359327P502.mbox1.freenet.de,S=2044,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:52Z</date> +	</dict> +	<key>1155595308.H206945P9299.mbox1.freenet.de,S=1539,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:52Z</date> +	</dict> +	<key>1155595714.H968683P18026.mbox1.freenet.de,S=1371,L=26</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:52Z</date> +	</dict> +	<key>1155605575.H514963P11444.mbox1.freenet.de,S=1582,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:52Z</date> +	</dict> +	<key>1155609054.H722461P26093.mbox1.freenet.de,S=1342,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:53Z</date> +	</dict> +	<key>1155609241.H114172P28491.mbox1.freenet.de,S=2377,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:53Z</date> +	</dict> +	<key>1155612954.H927628P8467.mbox1.freenet.de,S=14415,L=202</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:53Z</date> +	</dict> +	<key>1155613298.H183926P12165.mbox1.freenet.de,S=1594,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:54Z</date> +	</dict> +	<key>1155623498.H162605P23815.mbox1.freenet.de,S=18287,L=285</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:16:54Z</date> +	</dict> +	<key>1155627002.H454741P12744.mbox1.freenet.de,S=1289,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:31:50Z</date> +	</dict> +	<key>1155627889.H742535P26819.mbox1.freenet.de,S=2535,L=87</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T07:57:39Z</date> +	</dict> +	<key>1155634162.H456816P23232.mbox1.freenet.de,S=1713,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T09:31:47Z</date> +	</dict> +	<key>1155639133.H569323P26340.mbox1.freenet.de,S=52499,L=954</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T13:39:24Z</date> +	</dict> +	<key>1155642027.H16248P21003.mbox1.freenet.de,S=2468,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T13:39:29Z</date> +	</dict> +	<key>1155646523.H196753P28653.mbox1.freenet.de,S=4907,L=129</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T13:39:29Z</date> +	</dict> +	<key>1155647354.H345973P19847.mbox1.freenet.de,S=4138,L=70</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T13:39:29Z</date> +	</dict> +	<key>1155649003.H40740P30415.mbox1.freenet.de,S=14780,L=202</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T13:39:29Z</date> +	</dict> +	<key>1155655360.H224743P23901.mbox1.freenet.de,S=1751,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T15:23:49Z</date> +	</dict> +	<key>1155656257.H442639P10814.mbox1.freenet.de,S=12463,L=189</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:43Z</date> +	</dict> +	<key>1155658727.H21998P28019.mbox1.freenet.de,S=2629,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155660222.H789857P31515.mbox1.freenet.de,S=1713,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155660373.H539501P4119.mbox1.freenet.de,S=3977,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155660849.H475683P18605.mbox1.freenet.de,S=1779,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155661050.H849347P23410.mbox1.freenet.de,S=1723,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155662519.H272115P25223.mbox1.freenet.de,S=4066,L=120</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155663279.H93787P15524.mbox1.freenet.de,S=3286,L=99</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:20:47Z</date> +	</dict> +	<key>1155666170.H581264P16357.mbox1.freenet.de,S=1964,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T18:25:38Z</date> +	</dict> +	<key>1155672629.H698046P26779.mbox1.freenet.de,S=14858,L=202</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T20:13:32Z</date> +	</dict> +	<key>1155675970.H481059P829.mbox1.freenet.de,S=30101,L=568</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T21:14:42Z</date> +	</dict> +	<key>1155676427.H227690P9433.mbox1.freenet.de,S=28530,L=547</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-15T21:14:42Z</date> +	</dict> +	<key>1155679020.H360235P24199.mbox1.freenet.de,S=5379,L=138</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:32:57Z</date> +	</dict> +	<key>1155679259.H975948P30996.mbox1.freenet.de,S=1665,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155679666.H222655P5397.mbox1.freenet.de,S=13472,L=194</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155682595.H840883P17634.mbox1.freenet.de,S=2482,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155683025.H4077P24194.mbox1.freenet.de,S=28912,L=550</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155698954.H56251P20772.mbox1.freenet.de,S=1610,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155699730.H136388P29061.mbox1.freenet.de,S=13510,L=194</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155708190.H419348P27568.mbox1.freenet.de,S=1639,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:01Z</date> +	</dict> +	<key>1155708619.H61568P4130.mbox1.freenet.de,S=4824,L=73</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:02Z</date> +	</dict> +	<key>1155708934.H719113P13560.mbox1.freenet.de,S=4427,L=69</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:02Z</date> +	</dict> +	<key>1155709249.H561354P21490.mbox1.freenet.de,S=4621,L=68</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:33:02Z</date> +	</dict> +	<key>1155710073.H447832P6614.mbox1.freenet.de,S=2523,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T06:37:10Z</date> +	</dict> +	<key>1155712109.H228570P13737.mbox1.freenet.de,S=3950,L=163</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T07:16:49Z</date> +	</dict> +	<key>1155715259.H942469P29561.mbox1.freenet.de,S=4777,L=70</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T08:08:37Z</date> +	</dict> +	<key>1155726497.H229006P18946.mbox1.freenet.de,S=5076,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T11:27:53Z</date> +	</dict> +	<key>1155726841.H315888P31526.mbox1.freenet.de,S=2505,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T11:27:53Z</date> +	</dict> +	<key>1155731830.H203362P7473.mbox1.freenet.de,S=31693,L=579</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T12:40:23Z</date> +	</dict> +	<key>1155733467.H948324P28575.mbox1.freenet.de,S=29670,L=568</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T13:12:49Z</date> +	</dict> +	<key>1155740627.H596547P27213.mbox1.freenet.de,S=5489,L=143</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T19:17:33Z</date> +	</dict> +	<key>1155744035.H967627P7422.mbox1.freenet.de,S=1296,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T19:17:35Z</date> +	</dict> +	<key>1155745060.H914526P32159.mbox1.freenet.de,S=2595,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T19:17:35Z</date> +	</dict> +	<key>1155753499.H839663P19946.mbox1.freenet.de,S=1682,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T19:17:35Z</date> +	</dict> +	<key>1155754705.H760692P11736.mbox1.freenet.de,S=9002,L=379</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-16T19:17:35Z</date> +	</dict> +	<key>1155757129.H73453P26817.mbox1.freenet.de,S=3900,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:37Z</date> +	</dict> +	<key>1155762271.H271538P26592.mbox1.freenet.de,S=9158,L=380</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:40Z</date> +	</dict> +	<key>1155762960.H196055P6057.mbox1.freenet.de,S=2775,L=97</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:40Z</date> +	</dict> +	<key>1155764084.H509441P23252.mbox1.freenet.de,S=1709,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:40Z</date> +	</dict> +	<key>1155764556.H644385P29660.mbox1.freenet.de,S=14251,L=199</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:40Z</date> +	</dict> +	<key>1155774936.H450120P5009.mbox1.freenet.de,S=2777,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:40Z</date> +	</dict> +	<key>1155780523.H871720P4329.mbox1.freenet.de,S=3183,L=99</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:41Z</date> +	</dict> +	<key>1155783955.H51113P13218.mbox1.freenet.de,S=1799,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:41Z</date> +	</dict> +	<key>1155784022.H990661P14043.mbox1.freenet.de,S=14539,L=199</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:41Z</date> +	</dict> +	<key>1155793718.H955690P17050.mbox1.freenet.de,S=34755,L=632</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T06:30:41Z</date> +	</dict> +	<key>1155801361.H759607P6409.mbox1.freenet.de,S=2647,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:37Z</date> +	</dict> +	<key>1155802366.H621150P28413.mbox1.freenet.de,S=2917,L=66</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155802717.H226200P5106.mbox1.freenet.de,S=2787,L=66</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155803161.H223217P17067.mbox1.freenet.de,S=1569,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155807606.H620116P11099.mbox1.freenet.de,S=23684,L=829</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155808943.H257985P8125.mbox1.freenet.de,S=1803,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155810163.H393619P4857.mbox1.freenet.de,S=5100,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:18:40Z</date> +	</dict> +	<key>1155813863.H756962P28805.mbox1.freenet.de,S=1731,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:35:21Z</date> +	</dict> +	<key>1155815032.H298878P28376.mbox1.freenet.de,S=2763,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T11:53:34Z</date> +	</dict> +	<key>1155818963.H747901P22963.mbox1.freenet.de,S=34712,L=634</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:22Z</date> +	</dict> +	<key>1155818984.H739984P23410.mbox1.freenet.de,S=34308,L=633</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:23Z</date> +	</dict> +	<key>1155821900.H745528P30523.mbox1.freenet.de,S=14637,L=199</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155822043.H736444P1616.mbox1.freenet.de,S=5689,L=233</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155823988.H367897P19251.mbox1.freenet.de,S=3639,L=105</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155827411.H56325P7730.mbox1.freenet.de,S=4128,L=62</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155830753.H802421P22648.mbox1.freenet.de,S=2696,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155836839.H781658P6842.mbox1.freenet.de,S=3915,L=163</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155837795.H23180P1296.mbox1.freenet.de,S=1773,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:26Z</date> +	</dict> +	<key>1155840734.H800798P4865.mbox1.freenet.de,S=1689,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:27Z</date> +	</dict> +	<key>1155841425.H808648P21505.mbox1.freenet.de,S=34988,L=634</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:27Z</date> +	</dict> +	<key>1155844693.H738830P5437.mbox1.freenet.de,S=1424,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T20:32:27Z</date> +	</dict> +	<key>1155849030.H181753P18909.mbox1.freenet.de,S=2563,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T21:32:40Z</date> +	</dict> +	<key>1155850140.H201004P7026.mbox1.freenet.de,S=5513,L=141</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-17T21:32:40Z</date> +	</dict> +	<key>1155856569.H774450P31180.mbox1.freenet.de,S=14378,L=201</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:09Z</date> +	</dict> +	<key>1155858413.H985113P19952.mbox1.freenet.de,S=43251,L=733</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:10Z</date> +	</dict> +	<key>1155866739.H628872P13661.mbox1.freenet.de,S=14587,L=200</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:11Z</date> +	</dict> +	<key>1155867521.H542305P24567.mbox1.freenet.de,S=1470,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:11Z</date> +	</dict> +	<key>1155867939.H526630P498.mbox1.freenet.de,S=3322,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:11Z</date> +	</dict> +	<key>1155875999.H983999P3123.mbox1.freenet.de,S=7921,L=133</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:11Z</date> +	</dict> +	<key>1155876166.H404276P5169.mbox1.freenet.de,S=14596,L=201</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:11Z</date> +	</dict> +	<key>1155880133.H13635P26998.mbox1.freenet.de,S=1438,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:12Z</date> +	</dict> +	<key>1155881575.H161964P21959.mbox1.freenet.de,S=2546,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T06:27:12Z</date> +	</dict> +	<key>1155883400.H255525P17617.mbox1.freenet.de,S=7693,L=142</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T08:49:03Z</date> +	</dict> +	<key>1155884435.H930535P2478.mbox1.freenet.de,S=3339,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T08:49:04Z</date> +	</dict> +	<key>1155886199.H865896P10437.mbox1.freenet.de,S=40408,L=703</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T08:49:06Z</date> +	</dict> +	<key>1155886812.H222537P23034.mbox1.freenet.de,S=34692,L=632</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T08:49:06Z</date> +	</dict> +	<key>1155888897.H165107P3093.mbox1.freenet.de,S=1728,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T08:49:06Z</date> +	</dict> +	<key>1155894239.H249312P22078.mbox1.freenet.de,S=35341,L=635</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T10:27:53Z</date> +	</dict> +	<key>1155896408.H218608P8208.mbox1.freenet.de,S=36962,L=888</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T10:27:54Z</date> +	</dict> +	<key>1155899834.H107315P29722.mbox1.freenet.de,S=5051,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T13:42:12Z</date> +	</dict> +	<key>1155900128.H579880P5438.mbox1.freenet.de,S=1796,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T13:42:13Z</date> +	</dict> +	<key>1155908232.H143450P24816.mbox1.freenet.de,S=2679,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T13:42:13Z</date> +	</dict> +	<key>1155908730.H379921P3969.mbox1.freenet.de,S=1839,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T13:47:16Z</date> +	</dict> +	<key>1155909184.H50144P16561.mbox1.freenet.de,S=2705,L=96</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T17:40:33Z</date> +	</dict> +	<key>1155919201.H953928P10247.mbox1.freenet.de,S=14635,L=200</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T17:40:36Z</date> +	</dict> +	<key>1155919500.H299571P18227.mbox1.freenet.de,S=2781,L=83</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T17:40:36Z</date> +	</dict> +	<key>1155922317.H155721P10234.mbox1.freenet.de,S=3723,L=59</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T17:40:36Z</date> +	</dict> +	<key>1155926157.H516665P26689.mbox1.freenet.de,S=3872,L=162</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T18:45:07Z</date> +	</dict> +	<key>1155930117.H43110P409.mbox1.freenet.de,S=1657,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T19:42:59Z</date> +	</dict> +	<key>1155930487.H459342P6935.mbox1.freenet.de,S=1810,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T19:52:18Z</date> +	</dict> +	<key>1155931871.H711403P31320.mbox1.freenet.de,S=2754,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-18T20:13:08Z</date> +	</dict> +	<key>1155940967.H661079P21403.mbox1.freenet.de,S=3892,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155942954.H959054P13213.mbox1.freenet.de,S=2606,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155943594.H830163P21738.mbox1.freenet.de,S=14496,L=199</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155953941.H375532P22922.mbox1.freenet.de,S=37663,L=650</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155955639.H224625P4873.mbox1.freenet.de,S=2534,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155956770.H717876P16828.mbox1.freenet.de,S=1353,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155958211.H395151P1885.mbox1.freenet.de,S=1575,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:11Z</date> +	</dict> +	<key>1155959154.H720265P12713.mbox1.freenet.de,S=1645,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:12Z</date> +	</dict> +	<key>1155962213.H850812P15620.mbox1.freenet.de,S=3313,L=99</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:12Z</date> +	</dict> +	<key>1155964530.H674989P10524.mbox1.freenet.de,S=2473,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T06:32:12Z</date> +	</dict> +	<key>1155971182.H958306P25902.mbox1.freenet.de,S=1764,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T07:09:18Z</date> +	</dict> +	<key>1155975654.H360857P32746.mbox1.freenet.de,S=24281,L=380</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T08:21:55Z</date> +	</dict> +	<key>1155978606.H882247P21614.mbox1.freenet.de,S=4750,L=215</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T09:20:11Z</date> +	</dict> +	<key>1155978609.H91622P21762.mbox1.freenet.de,S=2843,L=83</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T09:20:12Z</date> +	</dict> +	<key>1155983252.H142286P31396.mbox1.freenet.de,S=1725,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T14:01:58Z</date> +	</dict> +	<key>1155990327.H250456P14330.mbox1.freenet.de,S=40658,L=710</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T14:01:59Z</date> +	</dict> +	<key>1155992006.H268992P14095.mbox1.freenet.de,S=5002,L=131</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T14:01:59Z</date> +	</dict> +	<key>1155993464.H775200P5734.mbox1.freenet.de,S=2750,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T14:01:59Z</date> +	</dict> +	<key>1155993923.H23966P13335.mbox1.freenet.de,S=1806,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T14:02:00Z</date> +	</dict> +	<key>1155998626.H531558P24470.mbox1.freenet.de,S=2782,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T15:17:45Z</date> +	</dict> +	<key>1156000731.H835960P7899.mbox1.freenet.de,S=13307,L=218</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T15:24:13Z</date> +	</dict> +	<key>1156001862.H12790P29824.mbox1.freenet.de,S=42175,L=796</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T15:47:46Z</date> +	</dict> +	<key>1156002114.H868256P2154.mbox1.freenet.de,S=2789,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T15:47:47Z</date> +	</dict> +	<key>1156002227.H64014P4163.mbox1.freenet.de,S=1648,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T15:47:47Z</date> +	</dict> +	<key>1156005285.H611697P29480.mbox1.freenet.de,S=3484,L=102</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T16:47:49Z</date> +	</dict> +	<key>1156005955.H380622P10683.mbox1.freenet.de,S=1664,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T16:47:50Z</date> +	</dict> +	<key>1156006709.H199343P23552.mbox1.freenet.de,S=3596,L=84</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T17:24:01Z</date> +	</dict> +	<key>1156008044.H808442P12305.mbox1.freenet.de,S=2899,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T17:24:01Z</date> +	</dict> +	<key>1156008369.H960103P17621.mbox1.freenet.de,S=2836,L=61</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T17:28:01Z</date> +	</dict> +	<key>1156008381.H841515P17850.mbox1.freenet.de,S=3458,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T17:28:01Z</date> +	</dict> +	<key>1156008500.H671840P19682.mbox1.freenet.de,S=4883,L=107</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T17:32:47Z</date> +	</dict> +	<key>1156008786.H901063P24353.mbox1.freenet.de,S=1410,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-19T18:26:38Z</date> +	</dict> +	<key>1156014162.H151759P29462.mbox1.freenet.de,S=8207,L=211</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:30Z</date> +	</dict> +	<key>1156014181.H164973P29778.mbox1.freenet.de,S=2801,L=83</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:33Z</date> +	</dict> +	<key>1156014251.H352625P31015.mbox1.freenet.de,S=4357,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156014340.H455048P320.mbox1.freenet.de,S=6468,L=159</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156014743.H629783P6625.mbox1.freenet.de,S=53033,L=881</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156018123.H961397P5943.mbox1.freenet.de,S=3905,L=163</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156028379.H828505P27266.mbox1.freenet.de,S=2767,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156028508.H894P29445.mbox1.freenet.de,S=1839,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156030327.H474473P18724.mbox1.freenet.de,S=1649,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156030963.H627766P28091.mbox1.freenet.de,S=2522,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156031101.H865938P30784.mbox1.freenet.de,S=1884,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156035905.H438180P20429.mbox1.freenet.de,S=16274,L=222</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156038032.H113870P16352.mbox1.freenet.de,S=7836,L=156</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:35Z</date> +	</dict> +	<key>1156044240.H86659P12513.mbox1.freenet.de,S=1682,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156051753.H810260P18368.mbox1.freenet.de,S=1558,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156052106.H745766P25697.mbox1.freenet.de,S=1661,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156052701.H989197P4642.mbox1.freenet.de,S=3779,L=57</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156054400.H787458P23430.mbox1.freenet.de,S=1741,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156058019.H137367P3773.mbox1.freenet.de,S=39348,L=700</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:36Z</date> +	</dict> +	<key>1156058731.H311112P14455.mbox1.freenet.de,S=39941,L=706</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:37Z</date> +	</dict> +	<key>1156060483.H441837P7720.mbox1.freenet.de,S=2072,L=46</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:37Z</date> +	</dict> +	<key>1156061154.H29866P20249.mbox1.freenet.de,S=3251,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:37Z</date> +	</dict> +	<key>1156061500.H245944P30226.mbox1.freenet.de,S=1849,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T09:54:37Z</date> +	</dict> +	<key>1156068184.H339810P27736.mbox1.freenet.de,S=2760,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T10:42:01Z</date> +	</dict> +	<key>1156069993.H861771P26685.mbox1.freenet.de,S=1731,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T10:42:02Z</date> +	</dict> +	<key>1156072809.H896197P13488.mbox1.freenet.de,S=2683,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T11:26:58Z</date> +	</dict> +	<key>1156073950.H741083P2725.mbox1.freenet.de,S=2736,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T13:46:06Z</date> +	</dict> +	<key>1156074277.H297055P12345.mbox1.freenet.de,S=4930,L=216</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T13:46:07Z</date> +	</dict> +	<key>1156074822.H289674P486.mbox1.freenet.de,S=1674,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T13:46:07Z</date> +	</dict> +	<key>1156076589.H226383P3006.mbox1.freenet.de,S=13122,L=182</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T13:46:07Z</date> +	</dict> +	<key>1156082622.H613666P8035.mbox1.freenet.de,S=1490,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T14:05:51Z</date> +	</dict> +	<key>1156084473.H524332P15040.mbox1.freenet.de,S=1386,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T14:36:01Z</date> +	</dict> +	<key>1156090742.H552842P4682.mbox1.freenet.de,S=1724,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T16:26:17Z</date> +	</dict> +	<key>1156090980.H629428P10269.mbox1.freenet.de,S=40061,L=704</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T16:26:18Z</date> +	</dict> +	<key>1156093399.H69021P27455.mbox1.freenet.de,S=2605,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T20:32:26Z</date> +	</dict> +	<key>1156093776.H964394P3345.mbox1.freenet.de,S=1648,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T20:32:28Z</date> +	</dict> +	<key>1156100633.H224315P22071.mbox1.freenet.de,S=6550,L=176</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T20:32:28Z</date> +	</dict> +	<key>1156100691.H592228P23082.mbox1.freenet.de,S=8705,L=235</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T20:32:28Z</date> +	</dict> +	<key>1156104739.H462735P1094.mbox1.freenet.de,S=2602,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-20T20:32:28Z</date> +	</dict> +	<key>1156109830.H17914P19227.mbox1.freenet.de,S=2492,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:49Z</date> +	</dict> +	<key>1156112101.H795367P17167.mbox1.freenet.de,S=2647,L=101</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156113315.H343544P762.mbox1.freenet.de,S=1658,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156114091.H694234P11549.mbox1.freenet.de,S=1772,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156115165.H762268P24644.mbox1.freenet.de,S=14527,L=200</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156116327.H660320P9489.mbox1.freenet.de,S=1460,L=38</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156116534.H55291P13612.mbox1.freenet.de,S=1449,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156119986.H882019P25652.mbox1.freenet.de,S=2823,L=104</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:50Z</date> +	</dict> +	<key>1156122853.H28178P27742.mbox1.freenet.de,S=2002,L=45</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:51Z</date> +	</dict> +	<key>1156131466.H176825P3041.mbox1.freenet.de,S=1708,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:51Z</date> +	</dict> +	<key>1156133130.H663462P20675.mbox1.freenet.de,S=2592,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:51Z</date> +	</dict> +	<key>1156133473.H468753P24781.mbox1.freenet.de,S=1739,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:51Z</date> +	</dict> +	<key>1156141359.H46959P9189.mbox1.freenet.de,S=1998,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:51Z</date> +	</dict> +	<key>1156141630.H425226P15434.mbox1.freenet.de,S=40631,L=707</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T06:48:52Z</date> +	</dict> +	<key>1156143777.H401918P28037.mbox1.freenet.de,S=37278,L=697</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T07:11:22Z</date> +	</dict> +	<key>1156145388.H594392P28582.mbox1.freenet.de,S=2833,L=97</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T07:47:00Z</date> +	</dict> +	<key>1156151885.H882182P30496.mbox1.freenet.de,S=1743,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T12:46:55Z</date> +	</dict> +	<key>1156153111.H998990P24464.mbox1.freenet.de,S=4674,L=114</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T12:46:56Z</date> +	</dict> +	<key>1156154981.H430092P31085.mbox1.freenet.de,S=2626,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T12:46:56Z</date> +	</dict> +	<key>1156155567.H266846P10396.mbox1.freenet.de,S=37062,L=649</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T12:46:57Z</date> +	</dict> +	<key>1156156653.H123786P1237.mbox1.freenet.de,S=1770,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T12:46:57Z</date> +	</dict> +	<key>1156170396.H551730P19808.mbox1.freenet.de,S=41193,L=711</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:19Z</date> +	</dict> +	<key>1156170466.H740758P21835.mbox1.freenet.de,S=51711,L=869</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:20Z</date> +	</dict> +	<key>1156171031.H926392P4585.mbox1.freenet.de,S=2822,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:20Z</date> +	</dict> +	<key>1156172230.H512316P6915.mbox1.freenet.de,S=24759,L=720</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:21Z</date> +	</dict> +	<key>1156172650.H717242P18326.mbox1.freenet.de,S=36601,L=652</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:21Z</date> +	</dict> +	<key>1156173039.H615099P28777.mbox1.freenet.de,S=1559,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T15:18:22Z</date> +	</dict> +	<key>1156177594.H375484P16541.mbox1.freenet.de,S=1656,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T17:44:50Z</date> +	</dict> +	<key>1156179152.H152794P24323.mbox1.freenet.de,S=4969,L=131</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T17:44:50Z</date> +	</dict> +	<key>1156179647.H207059P6245.mbox1.freenet.de,S=16092,L=443</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T17:44:51Z</date> +	</dict> +	<key>1156179723.H67824P7891.mbox1.freenet.de,S=15277,L=348</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T17:44:51Z</date> +	</dict> +	<key>1156180060.H346675P15430.mbox1.freenet.de,S=1685,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T17:44:51Z</date> +	</dict> +	<key>1156184445.H418632P10236.mbox1.freenet.de,S=4378,L=89</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T19:14:56Z</date> +	</dict> +	<key>1156186699.H700456P19447.mbox1.freenet.de,S=1233,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T19:14:56Z</date> +	</dict> +	<key>1156187075.H773717P27146.mbox1.freenet.de,S=6439,L=168</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T19:14:56Z</date> +	</dict> +	<key>1156187142.H119915P28764.mbox1.freenet.de,S=24952,L=729</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T19:14:57Z</date> +	</dict> +	<key>1156188434.H624660P25438.mbox1.freenet.de,S=1233,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T19:28:29Z</date> +	</dict> +	<key>1156190016.H585491P4204.mbox1.freenet.de,S=1233,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T20:10:45Z</date> +	</dict> +	<key>1156190229.H892273P10385.mbox1.freenet.de,S=31774,L=502</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T20:10:46Z</date> +	</dict> +	<key>1156191121.H58939P1014.mbox1.freenet.de,S=8464,L=170</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T20:15:48Z</date> +	</dict> +	<key>1156192210.H445719P28360.mbox1.freenet.de,S=3627,L=103</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T20:33:16Z</date> +	</dict> +	<key>1156193539.H965586P24560.mbox1.freenet.de,S=1691,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-21T20:53:33Z</date> +	</dict> +	<key>1156194052.H843898P1112.mbox1.freenet.de,S=1967,L=44</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:22Z</date> +	</dict> +	<key>1156196073.H946686P6609.mbox1.freenet.de,S=2988,L=69</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:24Z</date> +	</dict> +	<key>1156196215.H436396P8975.mbox1.freenet.de,S=7371,L=200</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:24Z</date> +	</dict> +	<key>1156196403.H875793P12311.mbox1.freenet.de,S=2590,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:24Z</date> +	</dict> +	<key>1156197011.H296928P21563.mbox1.freenet.de,S=3738,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:24Z</date> +	</dict> +	<key>1156200476.H48277P29045.mbox1.freenet.de,S=1986,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:25Z</date> +	</dict> +	<key>1156201055.H431831P10859.mbox1.freenet.de,S=1968,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:25Z</date> +	</dict> +	<key>1156203189.H194716P13945.mbox1.freenet.de,S=2412,L=64</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:25Z</date> +	</dict> +	<key>1156204076.H822392P25643.mbox1.freenet.de,S=1589,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:25Z</date> +	</dict> +	<key>1156204147.H248290P26727.mbox1.freenet.de,S=2650,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:25Z</date> +	</dict> +	<key>1156207011.H734989P30440.mbox1.freenet.de,S=30056,L=489</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:28Z</date> +	</dict> +	<key>1156210710.H728400P8151.mbox1.freenet.de,S=2498,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:28Z</date> +	</dict> +	<key>1156213391.H964402P5554.mbox1.freenet.de,S=5473,L=143</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:28Z</date> +	</dict> +	<key>1156215292.H927815P28287.mbox1.freenet.de,S=1586,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:28Z</date> +	</dict> +	<key>1156217397.H976068P19638.mbox1.freenet.de,S=1479,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T06:40:28Z</date> +	</dict> +	<key>1156229965.H933681P25828.mbox1.freenet.de,S=2421,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T07:14:03Z</date> +	</dict> +	<key>1156234060.H167927P7982.mbox1.freenet.de,S=3144,L=98</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T10:09:21Z</date> +	</dict> +	<key>1156240198.H552010P24198.mbox1.freenet.de,S=38144,L=593</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T10:09:21Z</date> +	</dict> +	<key>1156240239.H444189P25491.mbox1.freenet.de,S=38042,L=599</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T10:09:21Z</date> +	</dict> +	<key>1156243974.H843643P20009.mbox1.freenet.de,S=1676,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T13:10:59Z</date> +	</dict> +	<key>1156247073.H368328P32534.mbox1.freenet.de,S=36249,L=569</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T13:11:02Z</date> +	</dict> +	<key>1156247921.H894091P26986.mbox1.freenet.de,S=2596,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T13:11:03Z</date> +	</dict> +	<key>1156248662.H609680P13224.mbox1.freenet.de,S=37647,L=593</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T13:11:03Z</date> +	</dict> +	<key>1156254708.H669035P13799.mbox1.freenet.de,S=1542,L=27</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T13:56:52Z</date> +	</dict> +	<key>1156256353.H821648P30051.mbox1.freenet.de,S=3774,L=98</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T14:20:54Z</date> +	</dict> +	<key>1156256369.H12830P30457.mbox1.freenet.de,S=17408,L=480</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T14:20:55Z</date> +	</dict> +	<key>1156256982.H147690P13434.mbox1.freenet.de,S=1567,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T14:31:14Z</date> +	</dict> +	<key>1156260058.H608282P25599.mbox1.freenet.de,S=2984,L=66</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:04Z</date> +	</dict> +	<key>1156260534.H14160P5828.mbox1.freenet.de,S=3533,L=104</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:08Z</date> +	</dict> +	<key>1156265731.H362387P27705.mbox1.freenet.de,S=2127,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:08Z</date> +	</dict> +	<key>1156265942.H904452P1499.mbox1.freenet.de,S=2295,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:08Z</date> +	</dict> +	<key>1156273508.H146082P6958.mbox1.freenet.de,S=23332,L=624</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:08Z</date> +	</dict> +	<key>1156274107.H293316P22750.mbox1.freenet.de,S=5610,L=144</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:11Z</date> +	</dict> +	<key>1156275874.H463874P31726.mbox1.freenet.de,S=2711,L=81</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T19:53:11Z</date> +	</dict> +	<key>1156277419.H710606P2701.mbox1.freenet.de,S=2563,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-22T20:24:08Z</date> +	</dict> +	<key>1156285689.H685812P12554.mbox1.freenet.de,S=5035,L=121</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:04Z</date> +	</dict> +	<key>1156286221.H591132P20728.mbox1.freenet.de,S=1667,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:05Z</date> +	</dict> +	<key>1156286563.H445822P29014.mbox1.freenet.de,S=1444,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:05Z</date> +	</dict> +	<key>1156289183.H89604P29422.mbox1.freenet.de,S=1575,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156289963.H647307P6913.mbox1.freenet.de,S=3304,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156290394.H586113P16128.mbox1.freenet.de,S=5022,L=128</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156293727.H129171P20060.mbox1.freenet.de,S=1420,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156297635.H278548P20388.mbox1.freenet.de,S=1679,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156300709.H183097P594.mbox1.freenet.de,S=2569,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156305288.H901531P8596.mbox1.freenet.de,S=2933,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156310085.H727481P21928.mbox1.freenet.de,S=1594,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:06Z</date> +	</dict> +	<key>1156311497.H823295P7719.mbox1.freenet.de,S=17437,L=292</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:07Z</date> +	</dict> +	<key>1156311960.H256277P16603.mbox1.freenet.de,S=1878,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:41:07Z</date> +	</dict> +	<key>1156315347.H730367P1334.mbox1.freenet.de,S=2576,L=79</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:48:34Z</date> +	</dict> +	<key>1156315856.H546199P10284.mbox1.freenet.de,S=5053,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:58:08Z</date> +	</dict> +	<key>1156316015.H836293P15059.mbox1.freenet.de,S=2637,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T06:58:08Z</date> +	</dict> +	<key>1156317490.H316128P12220.mbox1.freenet.de,S=1609,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T07:53:19Z</date> +	</dict> +	<key>1156323069.H397905P7644.mbox1.freenet.de,S=1731,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:31Z</date> +	</dict> +	<key>1156328305.H107557P11033.mbox1.freenet.de,S=2684,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:31Z</date> +	</dict> +	<key>1156328610.H899510P21236.mbox1.freenet.de,S=20398,L=332</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:32Z</date> +	</dict> +	<key>1156329141.H976121P6861.mbox1.freenet.de,S=22614,L=364</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:34Z</date> +	</dict> +	<key>1156329381.H661923P16478.mbox1.freenet.de,S=3571,L=102</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:34Z</date> +	</dict> +	<key>1156331767.H169951P4175.mbox1.freenet.de,S=19386,L=321</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:34Z</date> +	</dict> +	<key>1156333292.H687377P23174.mbox1.freenet.de,S=19034,L=316</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:01:35Z</date> +	</dict> +	<key>1156335065.H813527P25388.mbox1.freenet.de,S=1855,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:20:52Z</date> +	</dict> +	<key>1156335128.H506627P27897.mbox1.freenet.de,S=34219,L=596</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T12:20:52Z</date> +	</dict> +	<key>1156337693.H916709P26274.mbox1.freenet.de,S=1488,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T14:33:15Z</date> +	</dict> +	<key>1156339969.H201016P29226.mbox1.freenet.de,S=2729,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T14:33:16Z</date> +	</dict> +	<key>1156340983.H489572P1578.mbox1.freenet.de,S=5353,L=138</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T14:33:18Z</date> +	</dict> +	<key>1156343905.H613262P29822.mbox1.freenet.de,S=18033,L=871</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T14:42:42Z</date> +	</dict> +	<key>1156347308.H585921P10247.mbox1.freenet.de,S=2509,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:03:36Z</date> +	</dict> +	<key>1156348235.H605443P5820.mbox1.freenet.de,S=24063,L=831</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:03:37Z</date> +	</dict> +	<key>1156349535.H189526P13945.mbox1.freenet.de,S=2784,L=82</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:03:37Z</date> +	</dict> +	<key>1156349791.H518401P22732.mbox1.freenet.de,S=7069,L=186</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:03:38Z</date> +	</dict> +	<key>1156352330.H449068P8873.mbox1.freenet.de,S=6059,L=155</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:03:38Z</date> +	</dict> +	<key>1156352921.H600969P29626.mbox1.freenet.de,S=25063,L=716</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:18:15Z</date> +	</dict> +	<key>1156353931.H733759P28776.mbox1.freenet.de,S=9424,L=258</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:38:06Z</date> +	</dict> +	<key>1156354448.H385753P11448.mbox1.freenet.de,S=1666,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T17:38:06Z</date> +	</dict> +	<key>1156355946.H172785P26542.mbox1.freenet.de,S=3133,L=98</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T18:02:28Z</date> +	</dict> +	<key>1156356879.H751770P17495.mbox1.freenet.de,S=64948,L=1457</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T19:11:41Z</date> +	</dict> +	<key>1156357949.H742519P7828.mbox1.freenet.de,S=1742,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T19:11:41Z</date> +	</dict> +	<key>1156359742.H927083P11243.mbox1.freenet.de,S=8924,L=302</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T19:11:41Z</date> +	</dict> +	<key>1156359904.H859310P14363.mbox1.freenet.de,S=6729,L=173</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T19:11:41Z</date> +	</dict> +	<key>1156360217.H1360P19796.mbox1.freenet.de,S=1649,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T19:11:42Z</date> +	</dict> +	<key>1156360946.H982607P633.mbox1.freenet.de,S=39555,L=717</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T21:19:56Z</date> +	</dict> +	<key>1156363621.H577806P17175.mbox1.freenet.de,S=1587,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T21:20:00Z</date> +	</dict> +	<key>1156364087.H814559P31535.mbox1.freenet.de,S=1532,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T21:20:00Z</date> +	</dict> +	<key>1156364446.H917308P8932.mbox1.freenet.de,S=1621,L=32</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T21:20:00Z</date> +	</dict> +	<key>1156366127.H829818P8733.mbox1.freenet.de,S=1353,L=31</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-23T21:20:00Z</date> +	</dict> +	<key>1156369166.H442716P21101.mbox1.freenet.de,S=2562,L=70</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:44Z</date> +	</dict> +	<key>1156370291.H719P6952.mbox1.freenet.de,S=1616,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:45Z</date> +	</dict> +	<key>1156371667.H788296P29922.mbox1.freenet.de,S=4999,L=132</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:45Z</date> +	</dict> +	<key>1156375748.H902317P11345.mbox1.freenet.de,S=2497,L=77</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:45Z</date> +	</dict> +	<key>1156384457.H617314P16691.mbox1.freenet.de,S=1584,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:46Z</date> +	</dict> +	<key>1156389145.H523602P9740.mbox1.freenet.de,S=2575,L=80</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:46Z</date> +	</dict> +	<key>1156390322.H953020P24591.mbox1.freenet.de,S=2138,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:46Z</date> +	</dict> +	<key>1156391277.H842866P5178.mbox1.freenet.de,S=1573,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:46Z</date> +	</dict> +	<key>1156392812.H490436P26555.mbox1.freenet.de,S=1943,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T05:58:46Z</date> +	</dict> +	<key>1156409023.H275252P19047.mbox1.freenet.de,S=16951,L=282</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T10:16:05Z</date> +	</dict> +	<key>1156409406.H140046P26739.mbox1.freenet.de,S=1689,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T10:16:05Z</date> +	</dict> +	<key>1156415085.H201171P20387.mbox1.freenet.de,S=1814,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T10:25:52Z</date> +	</dict> +	<key>1156416657.H807142P26711.mbox1.freenet.de,S=312347,L=4119</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T10:56:18Z</date> +	</dict> +	<key>1156423141.H738283P9595.mbox1.freenet.de,S=8204,L=155</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T13:14:17Z</date> +	</dict> +	<key>1156423586.H986469P18910.mbox1.freenet.de,S=24526,L=378</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T13:14:19Z</date> +	</dict> +	<key>1156423766.H305574P22337.mbox1.freenet.de,S=1757,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T13:14:19Z</date> +	</dict> +	<key>1156426034.H411561P11292.mbox1.freenet.de,S=1751,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T14:53:56Z</date> +	</dict> +	<key>1156426257.H814508P17034.mbox1.freenet.de,S=2142,L=50</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T14:53:57Z</date> +	</dict> +	<key>1156432315.H944338P11912.mbox1.freenet.de,S=1689,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T15:40:00Z</date> +	</dict> +	<key>1156437064.H929760P27072.mbox1.freenet.de,S=1396,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T16:34:59Z</date> +	</dict> +	<key>1156437552.H24990P7839.mbox1.freenet.de,S=1772,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T18:00:14Z</date> +	</dict> +	<key>1156437671.H85068P11659.mbox1.freenet.de,S=1684,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T18:00:15Z</date> +	</dict> +	<key>1156441998.H409093P17815.mbox1.freenet.de,S=5785,L=139</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T18:00:15Z</date> +	</dict> +	<key>1156446198.H125878P7360.mbox1.freenet.de,S=8722,L=270</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T19:26:26Z</date> +	</dict> +	<key>1156446298.H279321P9602.mbox1.freenet.de,S=7215,L=203</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T19:26:26Z</date> +	</dict> +	<key>1156446397.H304492P11756.mbox1.freenet.de,S=20240,L=558</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T19:26:27Z</date> +	</dict> +	<key>1156450351.H298345P26939.mbox1.freenet.de,S=4133,L=115</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T21:15:59Z</date> +	</dict> +	<key>1156453995.H371780P29628.mbox1.freenet.de,S=1580,L=28</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-24T21:16:00Z</date> +	</dict> +	<key>1156460441.H902493P17252.mbox1.freenet.de,S=1585,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:39:53Z</date> +	</dict> +	<key>1156460928.H250512P22577.mbox1.freenet.de,S=2571,L=78</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:40:10Z</date> +	</dict> +	<key>1156468449.H428556P31977.mbox1.freenet.de,S=1758,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:40:10Z</date> +	</dict> +	<key>1156468701.H640830P2031.mbox1.freenet.de,S=2381,L=76</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:40:10Z</date> +	</dict> +	<key>1156471052.H538705P24970.mbox1.freenet.de,S=3245,L=90</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:40:10Z</date> +	</dict> +	<key>1156472233.H352865P4623.mbox1.freenet.de,S=542213,L=7800</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T06:40:13Z</date> +	</dict> +	<key>1156490541.H545396P8320.mbox1.freenet.de,S=96654,L=1346</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T07:25:02Z</date> +	</dict> +	<key>1156492596.H148223P20881.mbox1.freenet.de,S=1999,L=34</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T09:31:31Z</date> +	</dict> +	<key>1156493168.H185516P7060.mbox1.freenet.de,S=1816,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T09:31:31Z</date> +	</dict> +	<key>1156502823.H884919P26106.mbox1.freenet.de,S=1691,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T11:31:46Z</date> +	</dict> +	<key>1156507113.H321643P19255.mbox1.freenet.de,S=5378,L=140</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T12:35:04Z</date> +	</dict> +	<key>1156507414.H963810P28046.mbox1.freenet.de,S=2857,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T12:35:04Z</date> +	</dict> +	<key>1156513457.H597038P18199.mbox1.freenet.de,S=1486,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:22Z</date> +	</dict> +	<key>1156516574.H33272P14791.mbox1.freenet.de,S=6938,L=118</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:23Z</date> +	</dict> +	<key>1156517309.H650800P29358.mbox1.freenet.de,S=2982,L=75</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:23Z</date> +	</dict> +	<key>1156522127.H373876P2643.mbox1.freenet.de,S=1587,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:23Z</date> +	</dict> +	<key>1156522766.H246625P20682.mbox1.freenet.de,S=3333,L=100</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:23Z</date> +	</dict> +	<key>1156529537.H136065P26779.mbox1.freenet.de,S=3780,L=116</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:24Z</date> +	</dict> +	<key>1156530524.H954463P14172.mbox1.freenet.de,S=3712,L=115</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T18:39:24Z</date> +	</dict> +	<key>1156532587.H787648P19469.mbox1.freenet.de,S=16095,L=437</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T19:22:38Z</date> +	</dict> +	<key>1156532679.H554445P21183.mbox1.freenet.de,S=5584,L=162</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T19:22:38Z</date> +	</dict> +	<key>1156532748.H638119P22590.mbox1.freenet.de,S=9089,L=198</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T19:22:38Z</date> +	</dict> +	<key>1156534574.H270836P24004.mbox1.freenet.de,S=21643,L=350</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T21:09:33Z</date> +	</dict> +	<key>1156536377.H578706P25236.mbox1.freenet.de,S=8217,L=176</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T21:09:36Z</date> +	</dict> +	<key>1156538955.H25329P11731.mbox1.freenet.de,S=1765,L=55</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T21:09:36Z</date> +	</dict> +	<key>1156541102.H692666P12671.mbox1.freenet.de,S=1506,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-25T21:38:36Z</date> +	</dict> +	<key>1156544069.H856248P27072.mbox1.freenet.de,S=1562,L=29</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:58Z</date> +	</dict> +	<key>1156549318.H314695P5966.mbox1.freenet.de,S=1594,L=51</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:58Z</date> +	</dict> +	<key>1156552574.H442749P8681.mbox1.freenet.de,S=28405,L=522</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:58Z</date> +	</dict> +	<key>1156553161.H622189P14963.mbox1.freenet.de,S=23163,L=374</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:59Z</date> +	</dict> +	<key>1156561537.H227330P14836.mbox1.freenet.de,S=3759,L=116</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:59Z</date> +	</dict> +	<key>1156564400.H36368P11833.mbox1.freenet.de,S=3864,L=118</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:59Z</date> +	</dict> +	<key>1156574920.H627211P18312.mbox1.freenet.de,S=3010,L=86</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:15:59Z</date> +	</dict> +	<key>1156576237.H864144P3629.mbox1.freenet.de,S=3196,L=109</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:16:00Z</date> +	</dict> +	<key>1156576267.H974879P4022.mbox1.freenet.de,S=3065,L=107</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T07:16:00Z</date> +	</dict> +	<key>1156579309.H517997P12771.mbox1.freenet.de,S=1724,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T09:38:43Z</date> +	</dict> +	<key>1156580704.H8509P31929.mbox1.freenet.de,S=1648,L=54</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T09:38:43Z</date> +	</dict> +	<key>1156581378.H425638P8539.mbox1.freenet.de,S=3939,L=119</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T09:38:44Z</date> +	</dict> +	<key>1156581789.H721913P14216.mbox1.freenet.de,S=7053,L=123</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T09:38:44Z</date> +	</dict> +	<key>1156590749.H170677P27688.mbox1.freenet.de,S=3377,L=112</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T11:43:22Z</date> +	</dict> +	<key>1156590890.H501398P30491.mbox1.freenet.de,S=1507,L=36</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T11:43:23Z</date> +	</dict> +	<key>1156594169.H314422P20793.mbox1.freenet.de,S=3866,L=117</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T12:59:47Z</date> +	</dict> +	<key>1156598595.H104465P28754.mbox1.freenet.de,S=1695,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T13:59:46Z</date> +	</dict> +	<key>1156602381.H87196P22354.mbox1.freenet.de,S=1632,L=52</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T14:59:32Z</date> +	</dict> +	<key>1156607782.H396993P12508.mbox1.freenet.de,S=5154,L=133</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T16:23:15Z</date> +	</dict> +	<key>1156608275.H103212P28930.mbox1.freenet.de,S=1350,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T16:23:16Z</date> +	</dict> +	<key>1156610616.H638298P7490.mbox1.freenet.de,S=4018,L=111</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T17:05:52Z</date> +	</dict> +	<key>1156610763.H278725P10198.mbox1.freenet.de,S=3691,L=58</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T17:05:53Z</date> +	</dict> +	<key>1156617667.H152062P26956.mbox1.freenet.de,S=4704,L=89</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T19:30:56Z</date> +	</dict> +	<key>1156618965.H215788P16362.mbox1.freenet.de,S=24100,L=687</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T19:30:57Z</date> +	</dict> +	<key>1156619069.H69198P18118.mbox1.freenet.de,S=8816,L=240</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T19:30:57Z</date> +	</dict> +	<key>1156619142.H495546P19352.mbox1.freenet.de,S=5115,L=134</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T19:30:57Z</date> +	</dict> +	<key>1156622683.H623990P9695.mbox1.freenet.de,S=4462,L=119</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-26T20:55:10Z</date> +	</dict> +	<key>1156627302.H474172P6812.mbox1.freenet.de,S=1705,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:46Z</date> +	</dict> +	<key>1156629242.H605644P32006.mbox1.freenet.de,S=1683,L=43</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156633050.H581303P13138.mbox1.freenet.de,S=1524,L=30</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156633485.H534083P21169.mbox1.freenet.de,S=3805,L=116</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156643912.H983156P23127.mbox1.freenet.de,S=3786,L=116</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156645412.H702961P12524.mbox1.freenet.de,S=1590,L=37</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156646412.H830885P22234.mbox1.freenet.de,S=3555,L=104</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:47Z</date> +	</dict> +	<key>1156648116.H733591P6025.mbox1.freenet.de,S=23089,L=370</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:48Z</date> +	</dict> +	<key>1156650850.H755558P2627.mbox1.freenet.de,S=1560,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:48Z</date> +	</dict> +	<key>1156657047.H587784P18251.mbox1.freenet.de,S=1699,L=56</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:48Z</date> +	</dict> +	<key>1156659804.H361202P11295.mbox1.freenet.de,S=4485,L=118</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T09:32:48Z</date> +	</dict> +	<key>1156677067.H165927P23712.mbox1.freenet.de,S=3816,L=116</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T11:22:35Z</date> +	</dict> +	<key>1156677789.H338206P3684.mbox1.freenet.de,S=3917,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T11:23:38Z</date> +	</dict> +	<key>1156678063.H539715P10854.mbox1.freenet.de,S=2414,L=48</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T11:33:05Z</date> +	</dict> +	<key>1156678360.H217893P18381.mbox1.freenet.de,S=1977,L=35</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T11:33:05Z</date> +	</dict> +	<key>1156679377.H960667P9014.mbox1.freenet.de,S=1780,L=33</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T11:59:11Z</date> +	</dict> +	<key>1156681141.H749219P15470.mbox1.freenet.de,S=1742,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T12:38:44Z</date> +	</dict> +	<key>1156682243.H802388P2173.mbox1.freenet.de,S=4615,L=120</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T12:38:44Z</date> +	</dict> +	<key>1156685948.H91108P27966.mbox1.freenet.de,S=1478,L=39</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T13:45:01Z</date> +	</dict> +	<key>1156686125.H586308P31263.mbox1.freenet.de,S=6825,L=95</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T13:45:02Z</date> +	</dict> +	<key>1156687202.H377173P17632.mbox1.freenet.de,S=1644,L=53</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T14:20:35Z</date> +	</dict> +	<key>1156690381.H436758P11593.mbox1.freenet.de,S=5589,L=144</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:01Z</date> +	</dict> +	<key>1156691746.H108969P4127.mbox1.freenet.de,S=20903,L=341</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +	<key>1156692551.H254066P19430.mbox1.freenet.de,S=3873,L=117</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +	<key>1156694718.H545079P28530.mbox1.freenet.de,S=21022,L=344</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +	<key>1156696327.H98631P26821.mbox1.freenet.de,S=9038,L=120</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +	<key>1156696693.H413970P1627.mbox1.freenet.de,S=2048,L=47</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +	<key>1156697667.H784900P20074.mbox1.freenet.de,S=1723,L=42</key> +	<dict> +	<key>DateDownloaded</key> +	<date>2006-08-27T17:50:04Z</date> +	</dict> +</dict> +</plist> 
diff --git a/ManualTests/memory/string-growth.html b/ManualTests/memory/string-growth.html new file mode 100644 index 0000000..2f921d0 --- /dev/null +++ b/ManualTests/memory/string-growth.html 
@@ -0,0 +1,16 @@ +<script> +var x = "x"; + +for (var i = 1; i < 23; ++i) { + x = x + x; +} + +// x should now be a 2^23 character string, which is 16M in size. + +var y; + +// now append to it repeatedly in a way that prevents buffer sharing +for (var i = 0; i < 1000; ++i) { + y = x + i; +}  +</script> 
diff --git a/ManualTests/memory/xhr-multiple-requests-responseText.html b/ManualTests/memory/xhr-multiple-requests-responseText.html new file mode 100644 index 0000000..463be57 --- /dev/null +++ b/ManualTests/memory/xhr-multiple-requests-responseText.html 
@@ -0,0 +1,57 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>TestWidget 1.3</title> + <script type="text/javascript"> + var mainDiv; + var widgetID = "12345678"; +  + function init() { + mainDiv = document.getElementById( "main" ); +  + if ( window.widget ) { + widget.setCloseBoxOffset( 304, 16 ); + window.resizeTo( 640, 480 ); + //widgetID = widget.identifier; + } + } +  + function getLocalMailIDList() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  + if (xmlHttp.readyState == 4) { + xmlHttp.responseText; + } + } +  + function getLocalMailIDList2() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  +  + if (xmlHttp.readyState == 4) { + xmlHttp.responseText; + } + } +  + function clear() { + mainDiv.innerText = "C:\\>"; + } +  + function fillMyRam() { + getLocalMailIDList2(); + setTimeout( "fillMyRam();", 500 ); + } + </script> + </head> +  + <body onLoad="init();"> + <div><a href="javascript:fillMyRam();">fillMyRam</a></div> + </body> +</html> 
diff --git a/ManualTests/memory/xhr-multiple-requests-responseXML.html b/ManualTests/memory/xhr-multiple-requests-responseXML.html new file mode 100644 index 0000000..939302a --- /dev/null +++ b/ManualTests/memory/xhr-multiple-requests-responseXML.html 
@@ -0,0 +1,117 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>TestWidget 1.3</title> + <script type="text/javascript"> + var mainDiv; + var widgetID = "12345678"; +  + function init() { + mainDiv = document.getElementById( "main" ); +  + if ( window.widget ) { + widget.setCloseBoxOffset( 304, 16 ); + window.resizeTo( 640, 480 ); + //widgetID = widget.identifier; + } + } +  + function getLocalMailIDList() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  + if (xmlHttp.readyState == 4) { + var items = xmlHttp.responseXML; + var counter = 0; +  + for ( var i = 0; i < items.childNodes.length; i++ ) { + counter++; +  + if ( items.childNodes[i].nodeName == "plist" ) { + counter++; + //alert( items.childNodes[i].nodeName ); +  + for ( var j = 0; j < items.childNodes[i].childNodes.length; j++) { + counter++; +  + if ( items.childNodes[i].childNodes[j].nodeName == "dict" ) { + counter++; + //alert( items.childNodes[i].childNodes[j].nodeName ); +  + for ( var k = 0; k < items.childNodes[i].childNodes[j].childNodes.length; k++) { + counter++; +  + if ( items.childNodes[i].childNodes[j].childNodes[k].nodeName == "key" ) { + counter++; + //alert( items.childNodes[i].childNodes[j].childNodes[k].nodeName ); + //alert( items.childNodes[i].childNodes[j].childNodes[k].firstChild.nodeValue ); + storedLocalMailIDList.push( items.childNodes[i].childNodes[j].childNodes[k].firstChild.nodeValue ); + } + } + } + } + } + } +  + /* + for ( var i = 0; i < storedLocalMailIDList.length; i++ ) { + counter++; + mainDiv.innerText = storedLocalMailIDList[i]; + } + */ + //alert(storedLocalMailIDList.length); +  +  + //storedLocalMailIDList.sort(); +  + alert(counter); + } + } +  + function getLocalMailIDList2() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  +  + if (xmlHttp.readyState == 4) { + var items = xmlHttp.responseXML; //.getElementsByTagName("key"); +  + /* + //alert(items.length); +  + for ( var i = 0; i < items.length; i+= 2 ) { + //alert( items[i].firstChild.nodeValue ); + //storedLocalMailIDList.push( items[i].firstChild.nodeValue ); + } +  + //for ( var i = 0; i < storedLocalMailIDList.length; i++ ) { + // mainDiv.innerText = storedLocalMailIDList[i]; + //} +  + //alert(storedLocalMailIDList.length); +  + //storedLocalMailIDList.sort(); + */ + } + } +  + function clear() { + mainDiv.innerText = "C:\\>"; + } +  + function fillMyRam() { + getLocalMailIDList2(); + setTimeout( "fillMyRam();", 500 ); + } + </script> + </head> +  + <body onLoad="init();"> + <div><a href="javascript:fillMyRam();">fillMyRam</a></div> + </body> +</html> 
diff --git a/ManualTests/memory/xhr-multiple-requests.html b/ManualTests/memory/xhr-multiple-requests.html new file mode 100644 index 0000000..17518b9 --- /dev/null +++ b/ManualTests/memory/xhr-multiple-requests.html 
@@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + <head> + <title>TestWidget 1.3</title> + <script type="text/javascript"> + var mainDiv; + var widgetID = "12345678"; +  + function init() { + mainDiv = document.getElementById( "main" ); +  + if ( window.widget ) { + widget.setCloseBoxOffset( 304, 16 ); + window.resizeTo( 640, 480 ); + //widgetID = widget.identifier; + } + } +  + function getLocalMailIDList() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  + if (xmlHttp.readyState == 4) { + } + } +  + function getLocalMailIDList2() { + var storedLocalMailIDList = new Array(); + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", "MessageUidsAlreadyDownloaded2", false);  + xmlHttp.send(null); +  +  + if (xmlHttp.readyState == 4) { + } + } +  + function clear() { + mainDiv.innerText = "C:\\>"; + } +  + function fillMyRam() { + getLocalMailIDList2(); + setTimeout( "fillMyRam();", 500 ); + } + </script> + </head> +  + <body onLoad="init();"> + <div><a href="javascript:fillMyRam();">fillMyRam</a></div> + </body> +</html> 
diff --git a/ManualTests/memory/xhr-repeated-string-access.xml b/ManualTests/memory/xhr-repeated-string-access.xml new file mode 100644 index 0000000..efb8e35 --- /dev/null +++ b/ManualTests/memory/xhr-repeated-string-access.xml 
@@ -0,0 +1,43 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +  + <head> + <title>Massive Memory Leak</title> + <script> + <![CDATA[ + + function loadVideo (videoURI) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', videoURI, true); + xhr.onreadystatechange = function (xhrEvent) { + if (xhr.readyState == 3) { + var currentLength = xhr.responseText.length; + var totalLength = parseInt(xhr.getResponseHeader('Content-Length'), 10); + print((Math.round((currentLength / totalLength) * 10000) / 100) + '%'); + } + else if (xhr.readyState == 4) { + if (xhr.status == 200) { + alert('done loading'); + alert(xhr.responseText.length); + } + else { + alert('NOK'); + } + } + }; + xhr.send(null); + } + + function print (message) { + document.getElementById('outlet').textContent = message; + } + + ]]> + </script> + </head> +  + <body> + <a onclick="loadVideo('http://streamos.atlrec.com/download/atlantic/bjork/video/bjork_itunes1.m4v');">do it!</a> + <p id="outlet" /> + </body> +  +</html> 
diff --git a/ManualTests/mouseevent-on-closeddoc.html b/ManualTests/mouseevent-on-closeddoc.html new file mode 100644 index 0000000..2da76bd --- /dev/null +++ b/ManualTests/mouseevent-on-closeddoc.html 
@@ -0,0 +1,22 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4229177"> 4229177</a> REGRESSION (Denver): crash dispatching mouse events (4608)</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click on the link below, and move your mouse cursor over the blank page that is loaded.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +No crash after moving the mouse over the blank page that is loaded. Nothing happens. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Crash after moving the mouse over the blank page that opens. +</p> + +<a href="resources/mouseevent-on-closeddoc.html">Click this link</a> +</body> +</html> 
diff --git a/ManualTests/mouseevents-on-textnodes.html b/ManualTests/mouseevents-on-textnodes.html new file mode 100644 index 0000000..2d1c226 --- /dev/null +++ b/ManualTests/mouseevents-on-textnodes.html 
@@ -0,0 +1,43 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script type="text/javascript" language="javascript" charset="utf-8"> + +	document.onmousedown = doIt; + +	function doIt(evt) { +	var elem = evt.target; +	var anAttr = null; +	alert (elem); +	} + +</script> + +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4196646">4196646</a> target returns text node when it should return the parent node</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click where indicated below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +After clicking, see alert dialogs as described below. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +After clicking, see alert dialogs other than what is described below. +Specifically, tests #1 and #3 below will alert "[object TEXT]" +</p> + +<p>1. click on this text - you should see an alert that says "[object P]"</p> + +<div style="border: 1px dotted red; width: 500px; ">2. click on white space next to this text --> <br>you should see an alert that says "[object DIV]" --> </div><br> + +3. click on this text - you should see an alert that says "[object BODY]"<br><br> + +4. click on empty whitespace on this page, below this text - you should see an alert that says "[object HTML]" + +</body> +</html> 
diff --git a/ManualTests/mutate-unfocused-text-with-selection.html b/ManualTests/mutate-unfocused-text-with-selection.html new file mode 100644 index 0000000..c193d12 --- /dev/null +++ b/ManualTests/mutate-unfocused-text-with-selection.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<body> +<p>This tests modifying a text node with selection but without a focus. +WebKit used to automatically set the focus to the root editable element of this node but it should not. +You should see 'PASS' below:</p> +<div id="target" onfocus="target.innerText='FAIL'" contenteditable>hello</div> +<div id="focused" contenteditable>world</div> +<script> + +var target = document.getElementById('target'); +var focused = document.getElementById('focused'); +focused.focus(); +getSelection().setBaseAndExtent(target.firstChild, 1, target.firstChild, 3); + +// The bug doesn't reproduce if this function was ran here or inside load event handler +setTimeout(function() { + target.firstChild.data = 'PASS'; + alert('activeElement:' + document.activeElement.id); // necessary to reproduce the bug +}, 50); + +</script> +</body> +</html> 
diff --git a/ManualTests/mutation-observer-leaks-nodes.html b/ManualTests/mutation-observer-leaks-nodes.html new file mode 100644 index 0000000..0efc6e8 --- /dev/null +++ b/ManualTests/mutation-observer-leaks-nodes.html 
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<body> +<script> +testRunner.dumpAsText(); +var count = 100; +var observer = new MutationObserver(function(){}); +for (var i = 0; i < count; i++) { + var span = document.createElement('span'); + observer.observe(span, {attributes:true}); +}; +GCController.collect(); +</script> +<p>Number of leaked nodes reported by DRT should be less than 100</p> +</body> 
diff --git a/ManualTests/named-window-blank-target.html b/ManualTests/named-window-blank-target.html new file mode 100644 index 0000000..33e8822 --- /dev/null +++ b/ManualTests/named-window-blank-target.html 
@@ -0,0 +1,19 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script type="text/javascript"> + window.name = "foo"; // any non-empty name will do here +</script> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=7747">Bugzilla bug 7747</a> REGRESSION: Background tab/window auto-refresh in GMail will take focus.</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +STEP 1: Close all other Safari windows and tabs.<br> +STEP 2: Open <a href="resources/named-window-blank-target-step2.html">this link</a> in a new window in front of this window and follow the instructions in it.  +</p> + + +</body> +</html> 
diff --git a/ManualTests/navigation-during-onload-triggered-by-back.html b/ManualTests/navigation-during-onload-triggered-by-back.html new file mode 100644 index 0000000..09a5f57 --- /dev/null +++ b/ManualTests/navigation-during-onload-triggered-by-back.html 
@@ -0,0 +1,16 @@ +<html> +<head> +</head> +<body> +<p>Same-document navigation in onload triggered by back navigation.</p> + <ol> + <li>Start the layout test web server with Tools/Scripts/run-webkit-httpd.</li> + <li>Click <a href="resources/navigation-during-onload-container.html">here</a>.</li> + <li>Click Back.</li> + </ol> +<p>You should not crash.</p> +<p>We cannot use history.back() to test this, because it calls Page::goToItem +(which calls FrameLoader::stopAllLoaders) first. Chromium's back button does +not call stopAllLoaders first.</p> +</body> +</html> 
diff --git a/ManualTests/nested-fixed-position.html b/ManualTests/nested-fixed-position.html new file mode 100644 index 0000000..9bb5200 --- /dev/null +++ b/ManualTests/nested-fixed-position.html 
@@ -0,0 +1,93 @@ +<html><head> + +<meta content="text/html; charset=windows-1251" http-equiv="Content-Type"> +<style> +.d1{position:fixed;top:50%;right:50%;z-index:2;overflow:hidden;} +.d2{position:fixed;bottom:0;left:0;z-index:2;width:100%;background-color:darkgray;} +.o {background:green;height:40px;width:200px;} +.t { width:2000px; height:198px;background-color: lightgray; border: 1px solid blue;} +body { margin: 0px; } +</style> +<script> +function remove_fixed() +{ + document.getElementById("d2").style.position = "static"; +} + +function add_fixed() +{ + document.getElementById("d2").style.position = "fixed"; +} + +</script> +</head> +<body> +<div class="d2" id="d2">This is the parent div. +<div class="d1" id="d1"><div class="o">This is the nested div.</div></div> +</div> +<div class="t"> +000 +</div> +<div class="t"> +200 +</div> +<div class="t"> +400<br> +<button onclick="remove_fixed();">remove fixed</button> +</div> +<div class="t"> +600<br> +<button onclick="add_fixed();">add fixed</button> +</div> +<div class="t"> +800 +</div> +<div class="t"> +1000 +</div> +<div class="t"> +1200 +</div> +<div class="t"> +1400 +</div> +<div class="t"> +1600 +</div> +<div class="t"> +1800 +</div> +<div class="t"> +2000 +</div> +<div class="t"> +2200 +</div> +<div class="t"> +2400 +</div> +<div class="t"> +2600 +</div> +<div class="t"> +2800 +</div> +<div class="t"> +3000 +</div> +<div class="t"> +3200 +</div> +<div class="t"> +3400 +</div> +<div class="t"> +3600 +</div> +<div class="t"> +3800 +</div> +<div class="t"> +4000 +</div> +</body></html> 
diff --git a/ManualTests/nested-plugins.html b/ManualTests/nested-plugins.html new file mode 100644 index 0000000..d1cd953 --- /dev/null +++ b/ManualTests/nested-plugins.html 
@@ -0,0 +1,45 @@ +<script> + function toggleDisplay(element, button) + { + if (element.style.display == "none") + element.style.display = ""; + else + element.style.display = "none"; + } + + function toggleVisibility(element, button) + { + if (element.style.visibility == "hidden") + element.style.visibility = ""; + else + element.style.visibility = "hidden"; + } + +</script> +<p> + Play with the display and visibility toggles. Make sure that turning an inner element visible does not show it if it has a hidden or + non-displaying ancestor, and that making an ancestor visible and displaying shows only its descendants the are visible and displaying. +</p> +<table> + <tr> + <td> + <input type="checkbox" checked="true" onclick="toggleDisplay(document.getElementById('middle'))"> Outer frame display + </td> + <td> + <input type="checkbox" checked="true" onclick="toggleDisplay(document.getElementById('middle').contentDocument.getElementById('inner'))"> Inner frame display + </td> + </tr> + <tr> + <td> + <input type="checkbox" checked="true" onclick="toggleVisibility(document.getElementById('middle'))"> Outer frame visibility + </td> + <td> + <input type="checkbox" checked="true" onclick="toggleVisibility(document.getElementById('middle').contentDocument.getElementById('inner'))"> Inner frame visibility + </td> + <td> + <input type="checkbox" checked="true" onclick="toggleVisibility(document.getElementById('middle').contentDocument.getElementById('inner').contentDocument.getElementById('plugin'))"> Inner plugin visibility + </td> + </tr> +</table> + +<iframe id="middle" style="height: 400px; width: 400px;" src="resources/nested-plugins-outer-frame.html"></iframe> 
diff --git a/ManualTests/new-window-subresource-crash.html b/ManualTests/new-window-subresource-crash.html new file mode 100644 index 0000000..b287d90 --- /dev/null +++ b/ManualTests/new-window-subresource-crash.html 
@@ -0,0 +1,20 @@ +<body onload="test()"> +<script> + function test() + { + var win = window.open(""); + var doc = win.document; + var text = "<html><body><sc" + "ript src='data:text/javascript,'></scr" + "ipt></body></html>"; + doc.write(text); + } +</script> + +<p>This test verifies that document.writing into a newly-opened empty +window does not cause crashes or assertion failures, even if it +triggers subresource loads. If you have popup blocking enabled you can +click the button below to test. The test only works in Safari, because +it depends on behavior with resource identifiers, which are provided +by the app.</p> + +<button onclick="test()">Crash</button> +</body> 
diff --git a/ManualTests/no-listbox-rendering.html b/ManualTests/no-listbox-rendering.html new file mode 100644 index 0000000..24336e0 --- /dev/null +++ b/ManualTests/no-listbox-rendering.html 
@@ -0,0 +1,66 @@ +<html> +<body> +<style> +td {padding: 20px} +</style> +<br><br> +This test just makes sense if webkit was build with NO_LISTBOX_RENDERING enabled.<br><br> +You should see in the following table three comboboxes and no listboxes.<br><br> +At the right cell you see a description of what should be the state of the elements just after loading this page.<br><br> +<form> +<table border="1"> + <tr> + <td><select><option>1</option><option>2</option></select></td> + <td>combobox in previos cell should have option '1' selected.</td> + </tr> + <tr> + <td><select multiple><option>1</option><option>2</option></select></td> + <td>combobox in previos cell should have no selected option.</td> + </tr> + <tr> + <td><select size="5"><option>1</option><option>2</option>s</select></td> + <td>combobox in previos cell should have no selected option.</td> + </tr> + <tr> + <td> + <select multiple> + <optgroup label="1"></optgroup> + <option>11</option> + <option>12</option> + <option>13</option> + <option>14</option> + <optgroup label="2"></optgroup> + <option>21</option> + <option>22</option> + <option>23</option> + <option>24</option> + </select> + </td> + <td>combobox in previos cell should handle optgroup correctly.</td> + </tr> + <tr> + <td> + <select> + <optgroup label="1"></optgroup> + <option>11</option> + <option>12</option> + <option>13</option> + <option>14</option> + <optgroup label="2"></optgroup> + <option>21</option> + <option>22</option> + <option>23</option> + <option>24</option> + </select> + </td> + <td>combobox in previos cell should handle optgroup correctly.</td> + </tr> + <tr> + <td><input type="reset"</td> + <td>after pressing this button all the combo boxes should go back to the state discribed above.</td> + </tr> +</table> +</form> +</body> +</html> + 
diff --git a/ManualTests/no-repaint-after-wake-from-sleep.html b/ManualTests/no-repaint-after-wake-from-sleep.html new file mode 100644 index 0000000..4d32288 --- /dev/null +++ b/ManualTests/no-repaint-after-wake-from-sleep.html 
@@ -0,0 +1,183 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <title>Test for Bug 39139</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <meta name="viewport" content="initial-scale=0.60, minimum-scale=0.60, maximum-scale=0.60"> + <style type="text/css"> + + body { + font-family: 'Lucida Grande', Verdana, Arial; + font-size: 12px; + } + + #stage { + margin: 150px auto; + width: 600px; + height: 400px; + /* +  + Setting the perspective of the contents of the stage + but not the stage itself +  + */ + -webkit-perspective: 800; + } + + #rotate { + margin: 0 auto; + width: 600px; + height: 400px; + /* Ensure that we're in 3D space */ + -webkit-transform-style: preserve-3d; + /* + Make the whole set of rows use the x-axis spin animation + for a duration of 7 seconds, running infinitely and linearly + */ + -webkit-animation-name: x-spin; + -webkit-animation-duration: 7s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } + + .ring { + margin: 0 auto; + height: 110px; + width: 600px; + -webkit-transform-style: preserve-3d; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; + } +  + .ring > :nth-child(odd) { + background-color: #995C7F; + } + + .ring > :nth-child(even) { + background-color: #835A99; + } + + .poster { + position: absolute; + left: 250px; + width: 100px; + height: 100px; + opacity: 0.7; + color: rgba(0,0,0,0.9); + -webkit-border-radius: 10px; + } +  + .poster > p { + font-family: 'Georgia', serif; + font-size: 36px; + font-weight: bold; + text-align: center; + margin-top: 28px; + } + + /* + Set up each row to have a different animation duration + and alternating y-axis rotation directions. + */ + #ring-1 { + -webkit-animation-name: y-spin; + -webkit-animation-duration: 5s; + } + + #ring-2 { + -webkit-animation-name: back-y-spin; + -webkit-animation-duration: 4s; + } + + #ring-3 { + -webkit-animation-name: y-spin; + -webkit-animation-duration: 3s; + } + + /* + + Here we define each of the three individual animations that + we will be using to have our 3D rotation effect. The first + animation will perform a full rotation on the x-axis, we'll + use that on the whole set of objects. The second and third + animations will perform a full rotation on the y-axis in + opposite directions, alternating directions between rows. +  + Note that you currently have to specify an intermediate step + for rotations even when you are using individual transformation + constructs. + + */ + @-webkit-keyframes x-spin { + 0% { transform: rotateX(0deg); } + 50% { transform: rotateX(180deg); } + 100% { transform: rotateX(360deg); } + } + + @-webkit-keyframes y-spin { + 0% { transform: rotateY(0deg); } + 50% { transform: rotateY(180deg); } + 100% { transform: rotateY(360deg); } + } + + @-webkit-keyframes back-y-spin { + 0% { transform: rotateY(360deg); } + 50% { transform: rotateY(180deg); } + 100% { transform: rotateY(0deg); } + } + </style> + + <script type="text/javascript"> + + const POSTERS_PER_ROW = 12; + const RING_RADIUS = 200; + + function setup_posters (row) + { + var posterAngle = 360 / POSTERS_PER_ROW; + for (var i = 0; i < POSTERS_PER_ROW; i ++) { + var poster = document.createElement('div'); + poster.className = 'poster'; + // compute and assign the transform for this poster + var transform = 'rotateY(' + (posterAngle * i) + 'deg) translateZ(' + RING_RADIUS + 'px)'; + poster.style.webkitTransform = transform; + // setup the number to show inside the poster + var content = poster.appendChild(document.createElement('p')); + content.textContent = i; + // add the poster to the row + row.appendChild(poster); + } + + } + + function init () + { + setup_posters(document.getElementById('ring-1')); + setup_posters(document.getElementById('ring-2')); + setup_posters(document.getElementById('ring-3')); + } + + // call init once the document is fully loaded + window.addEventListener('load', init, false); + + </script> + </head> +  + <body> + + <p>This is a test for <a href="https://bugs.webkit.org/show_bug.cgi?id=39139">Bug 39139: Pages + that use hardware acceleration don't repaint after waking computer from sleep</a>. To test, put + your computer to sleep (or "Standby", as Windows calls it). When you wake your computer up, the + animation below should still be running.</p> + <div id="stage"> + <div id="rotate"> + <div id="ring-1" class="ring"></div> + <div id="ring-2" class="ring"></div> + <div id="ring-3" class="ring"></div> + </div> + </div> + + </body> +  +</html> 
diff --git a/ManualTests/non-bmp.html b/ManualTests/non-bmp.html new file mode 100644 index 0000000..e7cc581 --- /dev/null +++ b/ManualTests/non-bmp.html 
@@ -0,0 +1,12 @@ +<html> +<head> +<title>Bug 25657 : Non-BMP characters</title> +</head> +<body> +Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=25657">bug 25657</a> :  +Listed below are Mathematical Bold Capital A through E (U+1D400 .. U+1D404). Note that you need to install a font covering Plane 1 like Code2001 for this test. +<div> +&#x1d400;&#x1d401;&#x1d402;&#x1d403;&#x1d404; +</div> +</body> +</html> 
diff --git a/ManualTests/onbeforeunload-close_with_javascript.html b/ManualTests/onbeforeunload-close_with_javascript.html new file mode 100644 index 0000000..525f8f1 --- /dev/null +++ b/ManualTests/onbeforeunload-close_with_javascript.html 
@@ -0,0 +1,40 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script language="JavaScript"> +function openWindow() { + window.open("./onbeforeunload-close_with_javascript.html","name","width=700px,height=500px"); +} +</script> +</head> +<BODY onbeforeunload="return 'onBeforeUnloadHandler return string is displayed here.';"> +<p><b>BUG ID:</b> <a href="rdar://problem/4394910">4394910</a> calling Javascript window.close() does not trigger onbeforeunload event</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +	<ol> +	<li>Click the "Open" button below.  +	<li>In the window that opens, click the "Close" button. +	</ol> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +After the close button is clicked, you should see a dialog that reads:</p> +<pre>Are you sure you want to navigate away from this page? + +onBeforeUnloadHandler return string is displayed here. + +Press OK to continue or Cancel to stay on the current page.</pre> +<p id="success" style="background-color:palegreen; padding:3px;">You should see the same dialog if you click the "Close" button in the main window. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +No dialog (as described above) after clicking the "Close" button in the newly opened window, or in the main window. +</p> + +<BODY onbeforeunload="return 'onBeforeUnloadHandler return string is displayed here.';"> +<input type=button value="Open Window" onclick="openWindow()"><br> +<input type=button value="Close Window" onclick="window.close();"><br> +<p>Click the Open Window button. Once the new window is opened, close the new window by clicking the Close Window button (not the browser's close window icon).</p> +</body> +</html> 
diff --git a/ManualTests/onclick_in_noncontent.html b/ManualTests/onclick_in_noncontent.html new file mode 100644 index 0000000..9c14674 --- /dev/null +++ b/ManualTests/onclick_in_noncontent.html 
@@ -0,0 +1,19 @@ +<html> +<head> +<script> +function displayAlert(element) +{ + alert('You clicked '+element.nodeName); +} +</script> +</head> +<body> + <table style="width:100px;height:100px;border:inset"> + <tr> + <td onclick="displayAlert(this)">Content.</td> + </tr> + </table> + <p>Click anywhere inside the table element and you should get an alert telling you so.</p> + <p>Bugzilla 3662 was that clicking in non-content did not fire onclick handler.</p> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/onfocus-alert-blinking-caret.html b/ManualTests/onfocus-alert-blinking-caret.html new file mode 100644 index 0000000..26b9812 --- /dev/null +++ b/ManualTests/onfocus-alert-blinking-caret.html 
@@ -0,0 +1,8 @@ +<!DOCTYPE HTML> + +<body> +Focus the field below, then dismiss the alert. The field should retain the focus, +and the caret in the field should blink. +<br> +<input onfocus="alert('Test');"> +</body> 
diff --git a/ManualTests/onsearch-enter.html b/ManualTests/onsearch-enter.html new file mode 100644 index 0000000..e6e15fe --- /dev/null +++ b/ManualTests/onsearch-enter.html 
@@ -0,0 +1,7 @@ +<html> +<body> + <input type="search" value="test" onsearch="document.getElementById('result').innerHTML='SUCCESS'"> + <p>This tests that onsearch handlers for search fields are invoked correctly when pressing enter. To test this in Safari, focus the search field and press enter. The text below should change to SUCCESS.</p>  + <div id="result">FAILURE</div> +</body> +</html> 
diff --git a/ManualTests/onunload-form-submit-crash.html b/ManualTests/onunload-form-submit-crash.html new file mode 100644 index 0000000..1813e3f --- /dev/null +++ b/ManualTests/onunload-form-submit-crash.html 
@@ -0,0 +1,9 @@ +<html> +<body onUnload="document.myForm.submit()"> +<a href="" onClick="location.href=location.href; return false;">Click here and see if Safari crashes.</a> +<p>Still with me? Now close the window and see if Safari crashes.</p> +<form name="myForm"> +</form> +</body> +<html> + 
diff --git a/ManualTests/open-after-close.html b/ManualTests/open-after-close.html new file mode 100644 index 0000000..4fcf5d2 --- /dev/null +++ b/ManualTests/open-after-close.html 
@@ -0,0 +1,16 @@ +<html> +<script> +	var url = "resources/open-after-close-popup.html"; + +	function test() { +	var w = window.open(url, 'popup', "height=200, width=200, top=100, left=100"); +	w.close(); +	window.open(url, 'popup', "height=200, width=200, top=100, left=100"); +	} +</script> +<body onload="test()"> +<p>This test checks for a regression against rdar://problem/3572585: window.open fails if name param = the name of a window just closed in same function.</p> +<p>If the test passes, you will see a "PASS" message open in a new window.</p> +<hr> +</body> +</html> 
diff --git a/ManualTests/open-close-tokenizer-crash.html b/ManualTests/open-close-tokenizer-crash.html new file mode 100644 index 0000000..d108cf8 --- /dev/null +++ b/ManualTests/open-close-tokenizer-crash.html 
@@ -0,0 +1,6 @@ +<html> + <body> + <input type="button" value="Click Here" onclick="window.open('resources/open-close-tokenizer-crash.html', 'foo');">  + Click the button above. Another browser window should open and then immediately close without crashing. + </body> +</html> 
diff --git a/ManualTests/open-url-undefined.html b/ManualTests/open-url-undefined.html new file mode 100644 index 0000000..2f725d5 --- /dev/null +++ b/ManualTests/open-url-undefined.html 
@@ -0,0 +1,11 @@ +<body> + <p> + Tests that <code>window.open()</code> does not interpret the missing URL + argument as the literal string &ldquo;undefined&rdquo;. + </p> + <p> + Click the Test button. A new window should open. To pass the test, the address + bar of the new window should be empty. If it contains a URL (ending with &ldquo;undefined&rdquo;), WebKit failed the test. + </p> + <button onclick="window.open()">Test</button> +</body> 
diff --git a/ManualTests/optgroup-empty-and-nested.html b/ManualTests/optgroup-empty-and-nested.html new file mode 100644 index 0000000..6aa3e7b --- /dev/null +++ b/ManualTests/optgroup-empty-and-nested.html 
@@ -0,0 +1,80 @@ +<html> +<head> + <title>Empty and nested optgroup elements</title> +</head> + +<body> + +<select> + <!-- A div here is invalid. However, both IE and Firefox will walk into it + and enumerate the elements inside. --> + <div> + <option value="1">Item one</option> + + <!-- this group has no children. We /should/ render it because that matches + IE and FireFox. --> + <optgroup label="Group one"></optgroup> + + <!-- this group has a text node child. It should render the same as group one. --> + <optgroup label="Group two"> </optgroup> + + <!-- for an optgroup without a label, IE will show an empty, unselectable row. + Firefox doesn't show it. We /do/ show it because someone might be using + it as a spacer. --> + <!-- Additionally, this has been updated to test the crash fixed in + https://bugs.webkit.org/show_bug.cgi?id=26656. When setting the + font-size in the <optgroup> to extra large, opening the select element + must not leave any unpainted areas of overlapping text. --> + <optgroup style="font-size: x-large;"> + <option value="2">Item inside an optgroup without a label</option> + </optgroup> + + <!-- for an optgroup with an empty label, IE will show an empty, + unselectable row. Firefox doesn't show it. We /do/ show it because + someone might be using it as a spacer. --> + <optgroup label=""> + <option value="3">Item inside an optgroup with an empty label</option> + </optgroup> + + <div> + <option value="4"></option> + <optgroup label="Group three"> + <option value="5">Item two</option> + <!-- nested groups are disallowed by the spec, but IE and Firefox will + flatten the tree. We should match them. --> + <optgroup label="Nested group 1"></optgroup> + <optgroup label="Nested group 2"> + <optgroup label="Nested group 3"> + <option value="6">Item three</option> + </optgroup> + </optgroup> + </optgroup> + </div> + <option value="7">Item four</option> + </div> +</select> + +<p>Click on the select element above. When it drops down you should see the following items in the list:</p> + +<ul> + <li>Item one</li> + <li><b>Group one</b></li> + <li><b>Group two</b></li> + <li><i>(unselectable, empty row)</i></li> + <li>Item inside an optgroup without a label</li> + <li><i>(unselectable, empty row)</i></li> + <li>Item inside an optgroup with an empty label</li> + <li><i>(selectable, empty row)</i></li> + <li><b>Group three</b></li> + <li>Item two</li> + <li><b>Nested group 1</b></li> + <li><b>Nested group 2</b></li> + <li><b>Nested group 3</b></li> + <li>Item three</li> + <li>Item four</li> +</ul> + +<p>The text of the rows of the dropdown must not overlap each other.</p> + +</body> +</html> 
diff --git a/ManualTests/overlappingTableSpans.html b/ManualTests/overlappingTableSpans.html new file mode 100644 index 0000000..861606a --- /dev/null +++ b/ManualTests/overlappingTableSpans.html 
@@ -0,0 +1,27 @@ +<html> +	<body> +	<table> +	<tr> +	<td width='1'></td> +	</tr> +	<tr> +	<td colspan='2' rowspan='2'></td> +	</tr> +	<tr> +	<td rowspan='2'></td> +	</tr> +	<tr> +	<td colspan='2'> +	<table> +	<tr> +	<td></td> +	<td> +	<input type='text' /> +	</td> +	</tr> +	</table> +	</td> +	</tr> +	</table> +	</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/paint-during-plugin-attach.html b/ManualTests/paint-during-plugin-attach.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ManualTests/paint-during-plugin-attach.html 
diff --git a/ManualTests/panScroll.html b/ManualTests/panScroll.html new file mode 100644 index 0000000..726755b --- /dev/null +++ b/ManualTests/panScroll.html 
@@ -0,0 +1,32 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> + <p><b>BUG ID:</b> <a href="https://bugs.webkit.org/show_bug.cgi?id=16424">Bugzilla Bug 16424</a> Enable auto-scroll in page by mouse middle click</p> + + <p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  + For each iframe : Middle-click within the iframe and then move your mouse.</p> + + <p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  + For each iframe (except the 6th one which explicitly refuses scroll), you should see the scroll bars follow your moves and even reach the end of the page included in the iframe. You should also see an 4 arrow designed icon on the initial click location. + </p> + + <p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  + The scroll doesn't follow the mouse moves or doesn't get activated (except the 6th one which explicitly refuses scroll). + </p> + + <div style="height=2000px;width=2000px"> + <iframe src="resources/big-page.html"></iframe> + <iframe src="resources/big-page.html" scrolling></iframe> + <iframe src="resources/big-page.html" scrolling=""></iframe> + <iframe src="resources/big-page.html" scrolling="auto"></iframe> + <iframe src="resources/big-page.html" scrolling="yes"></iframe> + <iframe src="resources/big-page.html" scrolling="no"></iframe> + <iframe src="resources/big-page.html" scrolling="bogus"></iframe> + <iframe src="resources/big-page.html" scrolling="1234"></iframe> + </div> + + </body> + </html> 
diff --git a/ManualTests/partially-opaque-form-elements.html b/ManualTests/partially-opaque-form-elements.html new file mode 100644 index 0000000..b525c64 --- /dev/null +++ b/ManualTests/partially-opaque-form-elements.html 
@@ -0,0 +1,27 @@ +<html> +<style> + body { opacity: 0.5; } +</style> +<body>  +<p><b>BUG ID:</b> <a href="https://bugs.webkit.org/show_bug.cgi?id=41113">Bugzilla bug 41113</a> [WinCairo] Text box backgrounds do not render in partially opaque layers</p> + +<div style="background-color:skyblue; padding:3px;"> +In the next paragraph you should see a partially opaque sequence including: +<ol> +<li>The word "Before"</li> +<li>A checkbox</li> +<li>A radio button</li> +<li>The world "After"</li> +</ol> +If this test is failing you might only see the word "Before." +</div> + +<p> +Before +<input value="Checkbox" type="checkbox"> +<input value="Radio" type="radio"> +After +</p> + +</body>  +</html> 
diff --git a/ManualTests/partially-opaque-text-input.html b/ManualTests/partially-opaque-text-input.html new file mode 100644 index 0000000..bef147e --- /dev/null +++ b/ManualTests/partially-opaque-text-input.html 
@@ -0,0 +1,25 @@ +<html> +<style> + body { opacity: 0.5; } +</style> +<body>  +<p><b>BUG ID:</b> <a href="https://bugs.webkit.org/show_bug.cgi?id=41113">Bugzilla bug 41113</a> [WinCairo] Text box backgrounds do not render in partially opaque layers</p> + +<div style="background-color:skyblue; padding:3px;"> +In the next paragraph you should see a partially opaque sequence including: +<ol> +<li>The word "Before"</li> +<li>A text box</li> +<li>The world "After"</li> +</ol> +If this test is failing you will not see the text box border. +</div> + +<p> +Before +<input type="text"/> +After +</p> + +</body>  +</html> 
diff --git a/ManualTests/password-caps-lock.html b/ManualTests/password-caps-lock.html new file mode 100644 index 0000000..d63e433 --- /dev/null +++ b/ManualTests/password-caps-lock.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body onload="document.getElementById('tf').focus()"> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=10577">10577</a> Caps lock icon should show in password fields</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Press the caps lock key. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Verify that the caps lock indicator icon is drawn in the password field. Verify that when you open a new window, the password field in the background window no longer has an indicator. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If there is no caps lock indicator, or if the indicator remains when the window is inactive, the test has failed. +</p> + +<input type="password" id="tf"> + +</body> +</html> 
diff --git a/ManualTests/password-ctrl-click-lose-focus.html b/ManualTests/password-ctrl-click-lose-focus.html new file mode 100644 index 0000000..26cfbc4 --- /dev/null +++ b/ManualTests/password-ctrl-click-lose-focus.html 
@@ -0,0 +1,23 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4604703">4604703</a> REGRESSION (NativeTextField): Focus is not removed from password field after I ctrl-click into a different field</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<br>1) Make a selection in the password field +<br>2) Ctrl-click in the text field</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +After ctrl-clicking in the text field, the password field should lose focus, and its selection should be cleared. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +After ctrl-clicking in the text field, if the password field still has a selection, the test has failed. +</p> +<br><input type="text" value="Ctrl-Click in this field. Test passes if the password field no longer has a selection." size=100></input> +<br><input type="password" id="pass" value="12345"></input> +</body> +</html> 
diff --git a/ManualTests/paste-crash.html b/ManualTests/paste-crash.html new file mode 100644 index 0000000..b88af1d --- /dev/null +++ b/ManualTests/paste-crash.html 
@@ -0,0 +1,26 @@ +<HTML><BODY> + <p>This test checks for a regression against.</p> + <p>To run the test:</p> + <ol> + <li>Select All + <li>Copy + <li>Paste into Blot + </ol> + <p>If you don't crash, you pass.</p> + <hr> + <iframe style="color: red"></iframe> + <iframe src=""></iframe> +</BODY></HTML> +<HTML><BODY> + <p>This test checks for a regression against.</p> + <p>To run the test:</p> + <ol> + <li>Select All + <li>Copy + <li>Paste into Blot + </ol> + <p>If you don't crash, you pass.</p> + <hr> + <iframe style="color: red"></iframe> + <iframe src=""></iframe> +</BODY></HTML> 
diff --git a/ManualTests/plain-text-paste.html b/ManualTests/plain-text-paste.html new file mode 100644 index 0000000..89ef451 --- /dev/null +++ b/ManualTests/plain-text-paste.html 
@@ -0,0 +1,57 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8276">Bugzilla bug 8276</a> REGRESSION (NativeTextField): Pasting a Finder item into a text field results in a file: URL being pasted instead of just the file name +<br><i>and</i><br> <b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8283">Bugzilla bug 8283</a> REGRESSION: File's path doesn't appear after dragging file into input field</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b><br> +1. Double-click <a href="resources/plain-text-paste.dmg">this disk image</a> in the Finder.<br> +2. Drag each item from the Finder window into the corresponding field below.<br> +3. Select item 5 in the Finder window and choose Copy &ldquo;5&rdquo; from the Finder&rsquo;s Edit menu.<br> +4. Back in Safari, click inside the &ldquo;Paste item 5 here&rdquo; field and choose Paste from the Edit menu.<br> +5. Eject the disk image. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The fields&rsquo; contents will match the Expected Contents. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The fields&rsquo; contents will NOT match the Expected Contents. +</p> +Plain text clipping +<table cellspacing="0" cellpadding="5"> + <col><col style="background: #ffc;"> + <tr> + <td></td> + <td><b>Expected Contents</b></td> + </tr> + <tr> + <td>Drag item 1 here: <input></td> + <td>Plain text clipping</td> + </tr> + <tr> + <td>Drag item 2 here: <input></td> + <td>Styled text clipping</td> + </tr> + <tr> + <td>Drag item 3 here: <input></td> + <td><i>full path to 3.gif, starting with a / character</i></td> + </tr> + <tr> + <td>Drag item 4 here: <input></td> + <td><i>full path to 4.txt, starting with a / character</i></td> + </tr> + <tr> + <td>Drag item 5 here: <input></td> + <td>http://www.ibm.com/</td> + </tr> + <tr> + <td>Paste item 5 here: <input></td> + <td>5</td> + </tr> +</body> +</html> 
diff --git a/ManualTests/plug-in-mutates-NSView-hierarchy-during-resize.html b/ManualTests/plug-in-mutates-NSView-hierarchy-during-resize.html new file mode 100644 index 0000000..367b16d --- /dev/null +++ b/ManualTests/plug-in-mutates-NSView-hierarchy-during-resize.html 
@@ -0,0 +1,37 @@ +<style> + div { padding: 10px; margin: 8px; } + embed { width: 50px; height: 50px; } + iframe { width: 50px; height: 50px; } +</style> +<script> + var callCount = 0; + + function hideFirst() + { + if (++callCount != 2) + return; + + var target = document.getElementById("target"); + if (!target) + return; + + target.parentNode.removeChild(target); + document.body.offsetTop; + } +</script> +<p> + Test that plugins cannot cause the NSView hierarchy to change beneath <tt>-[NSView _invalidateGStatesForTree]</tt>. +</p> +<p> + To test, resize the browser window. Reload and repeat a few times. Each time you resize, the orange rectangle and + its contents should vanish, and the browser should not crash. +</p> +<div id="target" style="border: solid orange;"> + <embed type="application/x-webkit-test-netscape"></embed> + <iframe src=""></iframe> + <iframe src=""></iframe> + <iframe src=""></iframe> +</div> +<div style="border: solid blue;"> + <embed type="application/x-webkit-test-netscape" onsetwindow="hideFirst()"></embed> +</div> 
diff --git a/ManualTests/plugin-controller-datasource.html b/ManualTests/plugin-controller-datasource.html new file mode 100644 index 0000000..6a70bf7 --- /dev/null +++ b/ManualTests/plugin-controller-datasource.html 
@@ -0,0 +1,23 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8658">Bugzilla bug 8658</a> Assertion failure in -[WebPluginContainerCheck _isForbiddenFileLoad] (bridge is null) when clicking QuickTime object with href</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click the small orange square below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +QuickTime Player will open <i>orange.mov</i>. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Nothing will happen in response to clicking the orange square. +</p> + +<EMBED id="e" src="resources/orange.mov" width="15" height="15" controller="false" href="#" target="QuickTimePlayer"></EMBED> +</body> +</html> 
diff --git a/ManualTests/plugin-in-iframe-scroll.html b/ManualTests/plugin-in-iframe-scroll.html new file mode 100644 index 0000000..182c43c --- /dev/null +++ b/ManualTests/plugin-in-iframe-scroll.html 
@@ -0,0 +1,7 @@ +<p>This test requires that accelerated compositing be disabled. Please scroll down to the bottom.</p> +<p>Both squares should be orange, with no red visible at any time.</p> +<iframe src="resources/plugin-in-iframe-scroll-iframe.html" width="300" height="300" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" style="border:1px"></iframe> + +<div style="height:1000px">&nbsp;</div> +<iframe src="resources/plugin-in-iframe-scroll-iframe.html" width="300" height="300" marginwidth="0" marginheight="0" frameborder="0" scrolling="no" style="border:1px"></iframe> +<div style="height:1000px">&nbsp;</div> 
diff --git a/ManualTests/plugin-visible-rect-change.html b/ManualTests/plugin-visible-rect-change.html new file mode 100644 index 0000000..3fe12e9 --- /dev/null +++ b/ManualTests/plugin-visible-rect-change.html 
@@ -0,0 +1,25 @@ +<p> + This test requires that accelerated compositing be disabled. Clicking the Test button should completely reveal the black-bordered box. + The orange video should completely fill the box, with the controller visible and touching the bottom of the box. There should be + not be any red visible. +</p> +<p> + <button onclick="test()">Test</button> +</p> +<div style="overflow: hidden; border: solid blue; position: relative;"> + <div style="height: 100px; padding: 0 8px;"> + </div> + <object type="video/quicktime" style="background-color: red; width: 300px; height: 241px; position: absolute; top: 50px; left: 40px; border: solid black;"> + <param name="src" value="resources/orange.mov"> + <param name="controller" value="true"> + <param name="autoplay" value="false"> + <param name="scale" value="tofit"> + </object> + <div id="target"></div> + <script> + function test() + { + document.getElementById("target").style.height = "500px"; + } + </script> +</div> 
diff --git a/ManualTests/plugins/flip4mac-update-alert-over-navigation.html b/ManualTests/plugins/flip4mac-update-alert-over-navigation.html new file mode 100644 index 0000000..2391717 --- /dev/null +++ b/ManualTests/plugins/flip4mac-update-alert-over-navigation.html 
@@ -0,0 +1,30 @@ +<html> +<head> + <title>Test case for &lt;rdar://problem/7313430&gt; Many crashes in Safari inside Flip4Mac below -[NSAlert didEndAlert:returnCode:contextInfo:]</title> +</head> +<body> + <h1>Test case for &lt;<a href='rdar://problem/7313430'>rdar://problem/7313430</a>&gt; Many crashes in Safari inside Flip4Mac below -[NSAlert didEndAlert:returnCode:contextInfo:]</h1> + + <p>This test requires Flip4Mac to be installed and an update to be available for the version that is installed. Previous versions + of Flip4Mac can be downloaded from <a href='http://dynamic.telestream.net/downloads/download-flip4macwmv.htm'>Telestream's website</a>. + As of the writing of this test on 2010-04-21 the latest available version of Flip4Mac is 2.3.2.6. The prior version to that, + version 2.3.1.2, is therefore currently the most recent version that will reproduce this bug due to it being the most recent version + with an update available. + </p> + + <p>Once Flip4Mac is installed, you can test the bug by doing the following.</p> + <ol> + <li>Launch the browser with <code>NSZombieEnabled=YES</code> and <code>NSDeallocateZombies=NO</code> set in the enrivonment.</li> + <li>Load this page. A Flip4Mac update alert will be displayed, and soon after the page will navigate.</li> + <li>After the new page has loaded click the "Cancel" button on the update alert.The browser should not crash.</li> + </ol> + + <p>If you have the correct version of Flip4Mac installed but do not see the update alert displayed when loading this page then you may need to delete + the Flip4Mac preferences to force it to check for updates. You can do this by removing <code>~/Library/Preferences/net.telestream.wmv.*</code> + and then relaunching the browser.</p> + + <object type="application/asx"></object> + + <script>window.setTimeout(function() { window.location = "data:text/html,If the browser does not crash when you click 'Cancel' in the Flip4Mac update alert sheet then the bug is not present."; }, 10000)</script> +</body> +</html> 
diff --git a/ManualTests/plugins/gtk-windowed-grey-glitch.html b/ManualTests/plugins/gtk-windowed-grey-glitch.html new file mode 100644 index 0000000..73975eb --- /dev/null +++ b/ManualTests/plugins/gtk-windowed-grey-glitch.html 
@@ -0,0 +1,20 @@ +<html> +<script type="text/javascript"> + function openFullScreenFlash() { + window.open("test.swf","","width=200,height=200"); + } +</script> +<head> + <title>Test grey glitch with fullscreen Flash animation (but 47742)</title> +</head> +<body> + <p>This manual test is used to test <a href="https://bugs.webkit.org/show_bug.cgi?id=47742">bug 47742</a>.</p> + <ul> + <li>1. Click on the button to open popup with full screen flash animation.</li> + <li>2. Make sure the popup content is not grey.</li> + <li>3. Resize the popup. </li> + <li>4. Make sure the resize does not produce grey flash (especially when scaling down).</li> + </ul> + <input type="button" value="Open fullscreen Flash" onclick="openFullScreenFlash();"/> +</body> +</html> 
diff --git a/ManualTests/plugins/object-clipping.html b/ManualTests/plugins/object-clipping.html new file mode 100644 index 0000000..6db3fc5 --- /dev/null +++ b/ManualTests/plugins/object-clipping.html 
@@ -0,0 +1,22 @@ +<!DOCTYPE html> + +<html> +<head> + <title>clipping objects</title> + <style type="text/css" media="screen"> + object { + margin: 30px; + border: 20px solid green; + } + </style> +</head> +<body> + <p>You should see a clipped video surrounded by a thick green border.</p> + <p><a href="https://bugs.webkit.org/show_bug.cgi?id=35555">https://bugs.webkit.org/show_bug.cgi?id=35555</a></p> + <object type="video/quicktime" data="../../../../LayoutTests/media/content/test.mp4" width="200" height="150"> + <param value="false" name="autoplay"> + <param value="false" name="controller"> + </object> + +</body> +</html> 
diff --git a/ManualTests/plugins/plugin-is-occluded-by-top-layer.html b/ManualTests/plugins/plugin-is-occluded-by-top-layer.html new file mode 100644 index 0000000..5777739 --- /dev/null +++ b/ManualTests/plugins/plugin-is-occluded-by-top-layer.html 
@@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html> +<head> +<style> +dialog div { + position: absolute; + top: 150px; + left: 150px; + height: 150px; + width: 150px; + background: pink; +} + +dialog { + top: 150px; + left: 150px; + margin: 0; + height: 200px; + width: 200px; + padding: 0; + border: 0; + background: green; +} + +dialog::backdrop { + top: 125px; + left: 125px; + height: 250px; + width: 250px; + position: absolute; + background: yellow; +} + +embed { + position: absolute; + top: 100px; + left: 100px; +} +</style> +<body> +<p>This tests that plugins do not appear on top of top layer elements. The test +passes if you see four boxes, whose stacking order is (from top to bottom): +pink, green, yellow, blue. The pink box is positioned in a way to make it clear +that it is on top of everything else.</p> +<embed src="../../LayoutTests/plugins/resources/simple_blank.swf" + type="application/x-shockwave-flash" + width="300" height="300" loop="false"> +<dialog> + <div></div> +</dialog> +<script> +function dialogIsEnabled() { + return !!document.createElement('dialog').showModal; +} + +function test() { + if (!dialogIsEnabled()) { + document.body.innerText = 'ERROR: <dialog> is not enabled. This test requires <dialog>.'; + return; + } + + dialog = document.querySelector('dialog'); + dialog.showModal(); +} + +test(); +</script> +</body> +</html> + 
diff --git a/ManualTests/plugins/plugin-occlusion-with-plugin-in-top-layer.html b/ManualTests/plugins/plugin-occlusion-with-plugin-in-top-layer.html new file mode 100644 index 0000000..cad3b0d --- /dev/null +++ b/ManualTests/plugins/plugin-occlusion-with-plugin-in-top-layer.html 
@@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html> +<head> +<style> +dialog { + margin: 0; + padding: 0; + border: 0; +} + +dialog::backdrop, embed { + position: absolute; +} + +dialog.top { + top: 150px; + left: 150px; + height: 200px; + width: 200px; + background: green; +} + +dialog.top::backdrop { + top: 140px; + left: 140px; + height: 220px; + width: 220px; + background: yellow; +} + +dialog.bottom embed { + top: 10px; + left: 10px; +} + +dialog.bottom { + top: 120px; + left: 120px; + height: 260px; + width: 260px; + background: green; +} + +dialog.bottom::backdrop { + top: 110px; + left: 110px; + height: 280px; + width: 280px; + background: yellow; +} + +#bottom-embed { + top: 100px; + left: 100px; +} +</style> +<body> +<p>This tests that plugins in the top layer are occluded only by higher-stacked +top layer elements. The test passes if you see six boxes stacked on each other, +in order (from top to bottom): green, yellow, blue, green, yellow, blue. +</p> + +<embed id="bottom-embed" + src="../../LayoutTests/plugins/resources/simple_blank.swf" + type="application/x-shockwave-flash" + width="300" height="300" loop="false"> + +<dialog class="bottom"> + <embed src="../../LayoutTests/plugins/resources/simple_blank.swf" + type="application/x-shockwave-flash" + width="240" height="240" loop="false"> +</dialog> + +<dialog class="top"></dialog> +<script> +function dialogIsEnabled() { + return !!document.createElement('dialog').showModal; +} + +function test() { + if (!dialogIsEnabled()) { + document.body.innerText = 'ERROR: <dialog> is not enabled. This test requires <dialog>.'; + return; + } + + dialogBottom = document.querySelector('dialog.bottom'); + dialogBottom.showModal(); + dialogTop = document.querySelector('dialog.top'); + dialogTop.showModal(); +} + +test(); +</script> +</body> +</html> 
diff --git a/ManualTests/plugins/plugin-paint-causes-layout.html b/ManualTests/plugins/plugin-paint-causes-layout.html new file mode 100644 index 0000000..4781c7e --- /dev/null +++ b/ManualTests/plugins/plugin-paint-causes-layout.html 
@@ -0,0 +1,39 @@ +<!DOCTYPE html> + +<html> +<head> + <style type="text/css" media="screen"> + embed { + position: absolute; + margin: 10px; + } +  + .container { + position: relative; + border: 2px solid blue; + padding: 20px; + width: 100px; + } +  + </style> + <script type="text/javascript" charset="utf-8"> + function hideFirst() + { + var firstDiv = document.getElementById('first'); + if (!firstDiv) + return; + + firstDiv.parentNode.removeChild(firstDiv); + document.body.clientWidth; + } + </script> +</head> +<body> + <embed type="application/x-webkit-test-netscape" onpaintevent="hideFirst()" drawingmodel="coreanimation"></embed> + + <p>This test should not assert or crash when loaded in Safari, when Safari captures a snapshot.</p> + <div id="first" class="container"> + </div> + +</body> +</html> 
diff --git a/ManualTests/plugins/test.swf b/ManualTests/plugins/test.swf new file mode 100644 index 0000000..8952982 --- /dev/null +++ b/ManualTests/plugins/test.swf Binary files differ 
diff --git a/ManualTests/plugins/timeout-dialog-displayed-over-navigation.html b/ManualTests/plugins/timeout-dialog-displayed-over-navigation.html new file mode 100644 index 0000000..80f2c34 --- /dev/null +++ b/ManualTests/plugins/timeout-dialog-displayed-over-navigation.html 
@@ -0,0 +1,25 @@ +<html> +<head> + <title>Test case for &lt;rdar://problem/7856151&gt; REGRESSION: NPP_Destroy is not called when page navigates when plugin is displaying modal dialog</title> + + <meta http-equiv="refresh" content="3; data:text/html,If we did not crash or hang and there is no Adobe Flash dialog on screen then this test was a success.<p><a href='javascript:history.back();'>Run again</a>.</p><p><a href='rdar://problem/7856151'>&amp;lt;rdar://problem/7856151&amp;gt;</a>.</p>"> +</head> +<body> + <h1>Test case for &lt;<a href='rdar://problem/7856151'>rdar://problem/7856151</a>&gt; REGRESSION: NPP_Destroy is not called when page navigates when plugin is displaying modal dialog</h1> + + <p>This page loads some Adobe Flash content that results in the Flash Player plugin displaying a modal alert window. The page then triggers + a navigation while this alert is on-screen. After the navigation completes the Flash Player plugin's modal alert should no longer be + visible on-screen and the plugin host and browser application should not crash. + </p> + + <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="550" height="400" align="middle"> + <param name="allowScriptAccess" value="sameDomain"> + <param name="allowFullScreen" value="false"> + <param name="movie" value="timeout-dialog-displayed-over-navigation.swf"> + <param name="quality" value="high"> + <param name="bgcolor" value="#ffffff"> + <embed src="timeout-dialog-displayed-over-navigation.swf" quality="high" bgcolor="#ffffff" width="550" height="400" align="middle" + allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"> + </object> +</body> +</html> 
diff --git a/ManualTests/plugins/timeout-dialog-displayed-over-navigation.swf b/ManualTests/plugins/timeout-dialog-displayed-over-navigation.swf new file mode 100644 index 0000000..7e7c3d9 --- /dev/null +++ b/ManualTests/plugins/timeout-dialog-displayed-over-navigation.swf Binary files differ 
diff --git a/ManualTests/plugins/windowed-in-iframe-2.html b/ManualTests/plugins/windowed-in-iframe-2.html new file mode 100644 index 0000000..b1188e0 --- /dev/null +++ b/ManualTests/plugins/windowed-in-iframe-2.html 
@@ -0,0 +1,26 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<title>Flash In IFrame Test File</title> +</head> + +<body> + + <b> This manual tests clipping and translation of plugin loaded as the src of an iframe + inside a div with auto overflow. The flash in the middle of this page should be clipped + to the size of the div and should scroll properly when scrolling the main frame as well + as the div itself. This was a problem for GTK+ in + <a href="https://bugs.webkit.org/show_bug.cgi?id=57644">bug 57644</a>. + </b> + <div style="height:300px;">&nbsp;</div> + <div style="width: 500px; height: 300px; overflow: auto;"> + <div style="height:100px;">&nbsp;</div> + <iframe width="600" height="368" src="test.swf" frameborder="0" allowfullscreen></iframe> + <div style="height:100px;">&nbsp;</div> + </div> + <div style="height:300px;">&nbsp;</div> +<br clear="all"> +</body> + +</html> 
diff --git a/ManualTests/plugins/windowed-in-iframe.html b/ManualTests/plugins/windowed-in-iframe.html new file mode 100644 index 0000000..fdb937c --- /dev/null +++ b/ManualTests/plugins/windowed-in-iframe.html 
@@ -0,0 +1,21 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<title>Flash In IFrame Test File</title> +</head> + +<body> + + <b> This manual tests verifies that when a plugin is loaded as the src of an iframe + and that iframe is outside of the viewport of the page, the plugin does not appear + in the upper left of the frame. When this page loads you should not see the Flash movie. + It should be shown only after you scroll to the bottom of the page. This was a problem for + GTK+ in <a href="https://bugs.webkit.org/show_bug.cgi?id=37769">bug 37769</a></b> <br/><br/> + <div style="height:2000px;">&nbsp;</div> + + <iframe width="600" height="368" src="test.swf" frameborder="0" allowfullscreen></iframe> +<br clear="all"> +</body> + +</html> 
diff --git a/ManualTests/plugins/windowed.html b/ManualTests/plugins/windowed.html new file mode 100644 index 0000000..56a02f4 --- /dev/null +++ b/ManualTests/plugins/windowed.html 
@@ -0,0 +1,109 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<title>Transparent Flash Test File</title> +<style> + #overlayDiv { + position: relative; + color: white; + background: black; + top: 50px; + left: -50px; + width: 200px; + opacity: 0.6; + float: left; + z-index: 1; + display: none; + }  + embed {  + float: left;  + -webkit-transition: -webkit-transform 3s ease-in; + } +</style> +<script> + function testVisibility() { + var flashPlugin = document.getElementById('flashPlugin'); + if (flashPlugin.style.display == 'none') { + flashPlugin.style.display = 'block'; + } else { + flashPlugin.style.display = 'none'; + } + } + + function testResize() { + var flashPlugin = document.getElementById('flashPlugin'); + flashPlugin.width = flashPlugin.width == "200" ? "100" : "200"; + flashPlugin.height = flashPlugin.height == "200" ? "100" : "200"; + } + + function testMove() { + var flashPlugin = document.getElementById('flashPlugin'); + var t = parseInt(flashPlugin.style.top); + flashPlugin.style['padding-left'] = "100px"; + } + + function testAnimation() { + var flashPlugin = document.getElementById('flashPlugin'); + flashPlugin.style.webkitTransform='rotate(180deg)'; + } + + function toggleDivOverFlash() { + var overlayDiv = document.getElementById('overlayDiv'); + if (overlayDiv.style.display != 'block') { + overlayDiv.style.display = 'block'; + } else { + overlayDiv.style.display = ''; + } + } +</script> +</head> + +<body> + + <b> Verify the following tests with and without the page scrolled (including seeming unrelated test cases like printing). <br/> + For the Qt port, test with QGraphicsView enabled and disabled</b> <br/><br/> + + <!-- <embed id="flashPlugin" src="http://www.youtube.com/v/loXfcsXRB-w&#038;hl=en&#038;fs=1" --!> + <embed id="flashPlugin" src="test.swf" + width="200" height="200" + type="application/x-shockwave-flash"> + </embed> + + <div id="overlayDiv"> This is an overlay that will display over the flash. In addition, you should be able to see + the flash through the div contents. </div> + + <div style="clear:both"/> + + <input type="checkbox" name="visibilityCheckBox"> Verify if the flash toggles visibility + <input type="button" id="visibilityButton" value="Test Visibility" onClick="testVisibility()"/><br/> + + <input type="checkbox" name="resizeCheckBox"> Verify if the flash resizes when element is resized + <input type="button" id="resizeButton" value="Test Resize" onClick="testResize()"/><br/> + + <input type="checkbox" name="moveCheckBox"> Verify if the flash moves when element is moved + <input type="button" id="moveButton" value="Test Move" onClick="testMove()"/><br/> + + <input type="checkbox" name="animationCheckBox"> Verify css animations with flash + <input type="button" id="animationButton" value="Test Animation" onClick="testAnimation()"/><br/> + + <input type="checkbox" name="printCheckBox"> Verify if printing displays flash on the print preview and printer output <br/> + + <input type="checkbox" name="zoomCheckBox"> Verify if elements in flash are correctly painted and clickable after zooming <br/> + + <input type="checkbox" name="screenshotBox"> Verify if taking a screenshot from QtTestBrowser displays flash <br/> + + <input type="checkbox" name="paintSystemsCheckBox"> Verify if flash is displayed with graphicssystems - raster, opengl <br/> + + <input type="checkbox" name="focusCheckBox"> Verify if shifting focus back and forth from flash to html works + <input value="Shift focus here"/></br/> + + <input type="checkbox" name="testZIndex"> Test if html can display over flash + <input type="button" value="Toggle transparent div" onClick="toggleDivOverFlash()"<br/> + + <input type="checkbox" name="testZIndex"> Test opaque mode by setting wmode to opaque <br/> + + <br/> +</body> + +</html> 
diff --git a/ManualTests/plugins/windowless.html b/ManualTests/plugins/windowless.html new file mode 100644 index 0000000..27e8a82 --- /dev/null +++ b/ManualTests/plugins/windowless.html 
@@ -0,0 +1,108 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> + +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<title>Transparent Flash Test File</title> +<style> + #overlayDiv { + position: relative; + color: white; + background: black; + top: 50px; + left: -50px; + width: 200px; + opacity: 0.6; + float: left; + z-index: 1; + display: none; + }  + embed {  + float: left;  + -webkit-transition: -webkit-transform 3s ease-in; + } +</style> +<script> + function testVisibility() { + var flashPlugin = document.getElementById('flashPlugin'); + if (flashPlugin.style.display == 'none') { + flashPlugin.style.display = 'block'; + } else { + flashPlugin.style.display = 'none'; + } + } + + function testResize() { + var flashPlugin = document.getElementById('flashPlugin'); + flashPlugin.width = flashPlugin.width == "200" ? "100" : "200"; + flashPlugin.height = flashPlugin.height == "200" ? "100" : "200"; + } + + function testMove() { + var flashPlugin = document.getElementById('flashPlugin'); + var t = parseInt(flashPlugin.style.top); + flashPlugin.style['padding-left'] = "100px"; + } + + function testAnimation() { + var flashPlugin = document.getElementById('flashPlugin'); + flashPlugin.style.webkitTransform='rotate(180deg)'; + } + + function toggleDivOverFlash() { + var overlayDiv = document.getElementById('overlayDiv'); + if (overlayDiv.style.display != 'block') { + overlayDiv.style.display = 'block'; + } else { + overlayDiv.style.display = ''; + } + } +</script> +</head> + +<body> + + <b> Verify the following tests with and without the page scrolled (including seeming unrelated test cases like printing). <br/> + For the Qt port, test with QGraphicsView enabled and disabled</b> <br/><br/> + + <!-- <embed id="flashPlugin" src="http://www.youtube.com/v/loXfcsXRB-w&#038;hl=en&#038;fs=1" --!> + <embed id="flashPlugin" src="test.swf" + width="200" height="200" + wmode="transparent" + type="application/x-shockwave-flash"> + </embed> + + <div id="overlayDiv"> This is an overlay that will display over the flash. In addition, you should be able to see + the flash through the div contents. </div> + + <div style="clear:both"/> + + <input type="checkbox" name="visibilityCheckBox"> Verify if the flash toggles visibility + <input type="button" id="visibilityButton" value="Test Visibility" onClick="testVisibility()"/><br/> + + <input type="checkbox" name="resizeCheckBox"> Verify if the flash resizes when element is resized + <input type="button" id="resizeButton" value="Test Resize" onClick="testResize()"/><br/> + + <input type="checkbox" name="moveCheckBox"> Verify if the flash moves when element is moved + <input type="button" id="moveButton" value="Test Move" onClick="testMove()"/><br/> + + <input type="checkbox" name="animationCheckBox"> Verify css animations with flash + <input type="button" id="animationButton" value="Test Animation" onClick="testAnimation()"/><br/> + + <input type="checkbox" name="printCheckBox"> Verify if printing displays flash on the print preview and printer output <br/> + + <input type="checkbox" name="zoomCheckBox"> Verify if elements in flash are correctly painted and clickable after zooming <br/> + + <input type="checkbox" name="screenshotBox"> Verify if taking a screenshot from QtTestBrowser displays flash <br/> + + <input type="checkbox" name="paintSystemsCheckBox"> Verify if flash is displayed with graphicssystems - raster, opengl <br/> + + <input type="checkbox" name="focusCheckBox"> Verify if shifting focus back and forth from flash to html works + <input value="Shift focus here"/></br/> + + <input type="checkbox" name="testZIndex"> Test if html can display over flash + <input type="button" value="Toggle transparent div" onClick="toggleDivOverFlash()"<br/> + + <br/> +</body> + +</html> 
diff --git a/ManualTests/pointer-events.html b/ManualTests/pointer-events.html new file mode 100644 index 0000000..7ffac8b --- /dev/null +++ b/ManualTests/pointer-events.html 
@@ -0,0 +1,203 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"> + <title>Test for 'pointer-events' property in HTML</title> + <style type="text/css" media="screen"> + #a { + pointer-events: auto; + background: #88f; + } + + #a:hover { + background: green; + } +  + #b { + pointer-events: none; + background: #88f; + } +  + #b:hover { + background: red; + } + + #c { + pointer-events: auto; + background: #88f; + } + + #c span { + pointer-events: none; + background: #8ff; + } + + #c:hover { + background: green; + } + + #d { + pointer-events: none; + background: #88f; + } + + #d span { + pointer-events: auto; + padding: 0 10px; + background: #8ff; + } + + #d:hover { + background: gray; + } + + #e { + padding: 10px; + pointer-events: none; + background: #88f; + } + + #e div { + pointer-events: auto; + background: #8ff; + } + + #e:hover { + background: gray; + } + + #e div:hover { + background: green; + } + + #f, #g, #h, #i, #k, #m { + padding: 10px; + background: #88f; + } + + #f { + pointer-events: auto; + } +  + #f:hover { + background: green; + } + + #g { + pointer-events: none; + } +  + #g:hover { + background: red; + } + + #h { + pointer-events: auto; + } +  + #h:hover { + background: green; + } + + #i { + pointer-events: none; + } +  + #i:hover { + background: red; + } + + #j { + background: #88f; + pointer-events: none; + } + + #j:hover { + background: gray; + } + + #k { + pointer-events: auto; + } +  + #k:hover { + background: green; + } + + #l { + background: #88f; + pointer-events: auto; + } + + #l:hover { + background: green; + } + + #m { + pointer-events: none; + } +  + #m:hover { + background: red; + } + + </style> +  +</head> +<body> + <h1>Testing 'pointer-events' property in HTML</h1> + + <p id="a">This whole paragraph SHOULD change background when hovered</p> + + <p id="b">This whole paragraph SHOULD NOT change background when hovered</p> + + <p id="c">This paragraph SHOULD change background when hovered anywhere including + <span>this inline text</span> even though the inline text ignores pointer events.</p> + + <p id="d">This paragraph SHOULD NOT change when the pointer is over only it but + <span>this inline text</span> SHOULD change and cause the parent to change also.</p> + + <div id="e">This paragraph SHOULD NOT change when the pointer is over only it (not the child) + <div>This child element SHOULD change and cause the parent to change also</div> + </div> + + <p> + The following image SHOULD change when the pointer is over it. + </p> + + <img id="f" src="../../../LayoutTests/media/content/abe.png"> + + <p> + The following image SHOULD NOT change when the pointer is over it. + </p> + + <img id="g" src="../../../LayoutTests/media/content/abe.png"> + + <p> + The following image SHOULD change when the pointer is over it. It is inline + with this paragraph. + <img id="h" src="../../../LayoutTests/media/content/abe.png"> + </p> + + <p> + The following image SHOULD NOT change when the pointer is over it. It is inline + with this paragraph. + <img id="i" src="../../../LayoutTests/media/content/abe.png"> + </p> + + <p id="j"> + This paragraph SHOULD NOT change when the pointer is over only it, but the child + image SHOULD react and cause the parent to change. + <img id="k" src="../../../LayoutTests/media/content/abe.png"> + </p> + + <p id="l"> + This paragraph SHOULD change when the pointer is over it, but the child + image SHOULD NOT react. + <img id="m" src="../../../LayoutTests/media/content/abe.png"> + </p> + +  +</body> +</html> 
diff --git a/ManualTests/pop-up-alignment-and-direction.html b/ManualTests/pop-up-alignment-and-direction.html new file mode 100644 index 0000000..b51798e --- /dev/null +++ b/ManualTests/pop-up-alignment-and-direction.html Binary files differ 
diff --git a/ManualTests/popup-width-restriction-within-screen.html b/ManualTests/popup-width-restriction-within-screen.html new file mode 100644 index 0000000..1ef2567 --- /dev/null +++ b/ManualTests/popup-width-restriction-within-screen.html 
@@ -0,0 +1,71 @@ +<html> +<head> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +<title> +Test the popup list box's width is rectricted within screen. +</title> +</head> +<body> + +<h3>Test left to right popup list box's width is restricted within the left screen.</h3> +<ol> + <li> Setup dual screens.</li> + <li> Launch browser and maximize the browser window size in the left screen.</li> + <li> Enter a very long string into "Left to right" text input box.</li> + <li> Hit enter. </li> + <li> Go back and start to enter the same string again.</li> + <li> Make sure the popup list box's width which suggests the result doesn't exceed the left screen width. </li> +</ol> + +<H3>Test right to left popup window width is restricted within the right screen.</H3> +<ol> + <li> Setup dual screens.</li> + <li> Launch browser and maximize the browser window size in the right screen.</li> + <li> Enter a very long string into "Right to Left" text input box.</li> + <li> Hit enter.</li> + <li> Go back and start to enter the same string again.</li> + <li> Make sure the popup list box's width which suggests the result doesn't exceed the right screen width.</li> +</ol> + +<br> +<form action="form_action.asp" method="get"> + Left to right <input type="text" name="lname" /><br /> + Right to left <input type="text" name="fname" dir="rtl"/><br /> + <input type="submit" value="Submit" /> +</form> + +<H3>Test left to right select window width is restricted within the left screen.</H3> +<ol> + <li> Setup dual screens.</li> + <li> Launch browser and maximize the browser window size in the left screen.</li> + <li> Click the following &lt;select&gt; item.</li> + <li> Make sure the drop-down box width in the following &lt;select&gt; doesn't exceed the left screen width.</li> +</ol> + +<select style="width:100px"> +<option>Arabic</option> +<option>Hebrew</option> +<option>English (United States)</option> +<option>Chinese (Simplified Chiense)</option> +<option>Japanese (hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge</option> +</select> + +<H3>Test right to left select window width is restricted within the right screen.</H3> +<ol> + <li> Setup dual screens.</li> + <li> Launch browser and maximize the browser window size in the right screen.</li> + <li> Click the following &lt;select&gt; item.</li> + <li> Make sure the drop-down box width in the following &lt;select&gt; doesn't exceed the right screen width.</li> +</ol> + +<select dir="rtl" style="width:100px"> +<option>Arabic</option> +<option>Hebrew</option> +<option>English (United States)</option> +<option>Chinese (Simplified Chiense)</option> +<option>Japanese (hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge</option> +</select> + + +</body> +</html> 
diff --git a/ManualTests/post-multi-file-upload.html b/ManualTests/post-multi-file-upload.html new file mode 100644 index 0000000..18f3039 --- /dev/null +++ b/ManualTests/post-multi-file-upload.html 
@@ -0,0 +1,35 @@ +<html> + <head> + <script type="text/javascript"> + var submittedFiles = 0; +  + function log(message) + { + document.getElementById('console').appendChild(document.createTextNode(message + "\n")); + } +  + function verifyResults() + { + if (submittedFiles == 3) { + var frame = document.getElementById('fr'); + frame.parentNode.removeChild(frame); + log("Test Passed"); + } else + log("Test Failed"); + } + </script> + </head> + <body onload="test()"> + <p> + This tests that the multi-file upload control works correctly. This test and the resources/multiFileResources must be placed on a web server so the test can be run manually.<br> + Choose "testFile1.html" "testFile2.html" and "testFile3.html" and submit the form. <br> + You should see a "Test Passed" or a "Test Failed" message after submitting the form.<br> + </p> + <form method="post" enctype="multipart/form-data" action="resources/multiFileResources/post-echo-and-notify-done.cgi" id="myForm" target="targetFrame"> + <input type="file" id="target" multiple name="multiFileInput"></input> + <input type="submit" value="Submit"> + </form> + <iframe name="targetFrame" id="fr"></iframe> + <pre id='console'></pre> + </body> +</html> 
diff --git a/ManualTests/pre-tab-selection-rect.html b/ManualTests/pre-tab-selection-rect.html new file mode 100644 index 0000000..d9a9801 --- /dev/null +++ b/ManualTests/pre-tab-selection-rect.html 
@@ -0,0 +1,66 @@ +<html> +<head> +<title>Highlighting preformatted text after tab</title> +<style type="text/css"> +#t4 { font-size: 36px; } +#t4:first-line { font-size:16px; } +</style> +<script type="text/javascript"> +function test1() +{ + var t = document.getElementById('t1').childNodes[1]; + window.getSelection().setBaseAndExtent(t, 1, t, 13); +} + +function test2() +{ + var t = document.getElementById('t2').childNodes[0]; + window.getSelection().setBaseAndExtent(t, 5, t, 23); +} + +function test3() +{ + var t = document.getElementById('t3').childNodes[0]; + window.getSelection().setBaseAndExtent(t, 5, t, 23); +} + +function test4() +{ + var t = document.getElementById('t4').childNodes[0]; + window.getSelection().setBaseAndExtent(t, 11, t, 29); +} +</script> +</head> +<body> +<p> +This is a test for <i>http://bugs.webkit.org/show_bug.cgi?id=6043 +Incorrect selection highlighting in pre-formatted text with tabs</i>. +</p> +<hr> +<p> +Instructions: +</p> +<p> +1. Click <a href="#" onclick="window.setTimeout(test1,1);">test 1</a>. +The entire word &ldquo;highlighting&rdquo; below should be highlighted. +</p> +<pre id="t1"><span>Buggy</span>	highlighting</pre> +<p> +2. Click <a href="#" onclick="window.setTimeout(test2,1);">test 2</a>. +The words &ldquo;buggy highlighting&rdquo; below should be fully highlighted. +</p> +<pre id="t2" style="padding-left: 10px;">Very buggy	highlighting</pre> +<p> +3. Click <a href="#" onclick="window.setTimeout(test3,1);">test 3</a>. +The words &ldquo;buggy highlighting&rdquo; below should be fully highlighted. +</p> +<pre id="t3" style="margin-left: 10px;">Very buggy	highlighting</pre> +<p> +4. Click <a href="#" onclick="window.setTimeout(test4,1);">test 4</a>. +The words &ldquo;buggy highlighting&rdquo; below should be fully highlighted. +</p> +<p id="t4"> +Even more buggy highlighting. +</p> +</body> +</html> 
diff --git a/ManualTests/preload-scanner-entities.html b/ManualTests/preload-scanner-entities.html new file mode 100644 index 0000000..21446ae --- /dev/null +++ b/ManualTests/preload-scanner-entities.html 
@@ -0,0 +1,7 @@ +<script src="does_not_exist_here_just_to_trigger_preload_scanner.js" type="text/javascript"></script> +<link href="non_existent_stylesheet1&ab-" rel="stylesheet"> +<link href="non_existent_stylesheet2&#xY" rel="stylesheet"> +<link href="non_existent_stylesheet3&#XY" rel="stylesheet"> +<p><a href="rdar://problem/6904095">rdar://problem/6904095</a> Query parameters are sometimes incorrect in URL</p> +<p>Check with the web inspector that the page tried to load 3 stylesheet resources (and not more).</p> + 
diff --git a/ManualTests/print-after-window-close.html b/ManualTests/print-after-window-close.html new file mode 100644 index 0000000..f29e39d --- /dev/null +++ b/ManualTests/print-after-window-close.html 
@@ -0,0 +1,9 @@ +<script> +function crash() { + var w = window.open("data:text/html,Loading a data URL is asynchronous, so this text shouldn't appear. But it's most important to check that there is no crash after dismissing the print sheet."); + w.document.write("SUCCESS"); + w.print(); + w.close(); +} +</script> +<button onclick="crash()">Crash</button> 
diff --git a/ManualTests/print-before-load.html b/ManualTests/print-before-load.html new file mode 100644 index 0000000..edec30b --- /dev/null +++ b/ManualTests/print-before-load.html 
@@ -0,0 +1,16 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>Print Test Page</title> +<body> + +<script language="JavaScript" type="text/javascript"> +window.print(); +</script> + +This webpage should pop up a print dialog. If you print from that dialog, you +should see this output on paper. + +</body> +</html> + 
diff --git a/ManualTests/print-onload-with-image.html b/ManualTests/print-onload-with-image.html new file mode 100644 index 0000000..4d34a11 --- /dev/null +++ b/ManualTests/print-onload-with-image.html 
@@ -0,0 +1,13 @@ +<html> +<head> +<meta http-equiv=Content-Type content="text/html; charset=UTF-8"> +<title>Print Test</title> +</head> +<body onload="window.print()"> +<img src="http://code.google.com/p/chromium/logo?cct=1287781185"> +<H1>Hello, world.</h1> +<p> +This webpage should pop up a print dialog. +</p> +</body> +</html> 
diff --git a/ManualTests/print-with-height-transition-in-screen-stylesheet.html b/ManualTests/print-with-height-transition-in-screen-stylesheet.html new file mode 100644 index 0000000..2186c18 --- /dev/null +++ b/ManualTests/print-with-height-transition-in-screen-stylesheet.html 
@@ -0,0 +1,26 @@ +<head> +<style media="screen"> +.outer_slide { + overflow: hidden; + height: 0; + -webkit-transition: height 100s ease-in-out; +} +</style> +</head> + <body> +<div>To run this test, Print and then push the Preview button (on Mac OS X). The symptom of the bug is a layout with overlapping text or missing sections. +If the test passes you should be able to see eight different lines below A, A1, A2, A3, B, B1, C, and C1. If it fails you might see as few as four lines.</div> +<div><br></div> +<div>A: When printing you should be able to see all three paragraphs below.</div> +<div class='outer_slide'> + <div>A1: This is a long paragraph which helps us see the mess you can get with long ones.<br> + A2: This is a long paragraph which helps us see the mess you can get with long ones.<br> + A3: This is a long paragraph which helps us see the mess you can get with long ones.<br> +</div></div> +<div>B: When printing you should be able to see one line below.</div> +<div class='outer_slide'><div>B1: This is a long paragraph which helps us see the mess you can get with long ones.</div></div> +<div>C: When printing you should be able to see one line below</div> +<div class='outer_slide'><div>C1: This is a long paragraph which helps us see the mess you can get with long ones.</div></div> +</div> +</body> +</html> 
diff --git a/ManualTests/property-map-save-crash.html b/ManualTests/property-map-save-crash.html new file mode 100644 index 0000000..c4dce1a --- /dev/null +++ b/ManualTests/property-map-save-crash.html 
@@ -0,0 +1,49 @@ +<html> + <head> + <script> + function test() + { + if (window.layoutTestController) { + layoutTestController.dumpAsText(); + layoutTestController.waitUntilDone(); + } +  + window.crash = "crash"; + delete window.crash; +  + if (window.navigationController) + navigationController.evalAfterBackForwardNavigation("continueTestAfterNavigation()"); + } +  + function continueTestAfterNavigation() + { + print("PASS: You didn't crash"); +  + if (window.layoutTestController) + layoutTestController.notifyDone(); + } + + function print(message) { + var paragraph = document.createElement("p"); + paragraph.appendChild(document.createTextNode(message)); + document.getElementById("console").appendChild(paragraph); + } + </script> + </head> + + <body onload="test()"> + <p>Bug: rdar://problem/4465598 REGRESSION (TOT): Crash occurs at http://maps.google.com/?output=html ( KJS::Identifier::add(KJS::UString::Rep*)</p>  + <p>This cause for this bug was that the code to save the window object's property map tried to use + the deleted property sentinel key as a normal pointer.</p> + <p>To run this test in Safari:</p> + <ol> + <li><a href="resources/go-back.html">Click here to do a back/forward navigation.</a></li> + <li>You should not crash.</li> + </ol> + <p>When the automated version of this test passes, you'll see a PASS message below. + (The automated version is currently disabled because DumpRenderTree doesn't work + with the back/forward cache enabled.)</p> + <hr> + <div id="console"></div> + </body> +</html> 
diff --git a/ManualTests/quit-inside-unload.html b/ManualTests/quit-inside-unload.html new file mode 100644 index 0000000..23ae71d --- /dev/null +++ b/ManualTests/quit-inside-unload.html 
@@ -0,0 +1,14 @@ +<script> + var showedAlert = false; + function handleUnload() + { + if (showedAlert) + return; + + showedAlert = true; + alert("Now Quit Safari. Do not dismiss this alert first."); + } +</script> +<body onunload="handleUnload()"> + Close this window +</body> 
diff --git a/ManualTests/redirect.html b/ManualTests/redirect.html new file mode 100644 index 0000000..f02a707 --- /dev/null +++ b/ManualTests/redirect.html 
@@ -0,0 +1,2 @@ +<meta http-equiv="refresh" content="0;url=redirection-target.html"> +<p>See redirection-target.html for details of what this tests.</p> 
diff --git a/ManualTests/redirectHistory/redir-1.html b/ManualTests/redirectHistory/redir-1.html new file mode 100644 index 0000000..1cdab45 --- /dev/null +++ b/ManualTests/redirectHistory/redir-1.html 
@@ -0,0 +1,10 @@ +<html> +<head> +<meta http-equiv="refresh" content="3;url=redir-2.html"/> +<title>Redirect 1</title> +</head> +<body> +<p>This test checks that a &quot;quick&quot; redirect does not create an extra entry in the back/forward list. See Radar 4351664.</p> +<p>Wait a few seconds for the redirect to occur. If you return to this page after the redirect, then the test passed. If you end up at redir-2.html, then the test failed.</p> +</body> +</html> 
diff --git a/ManualTests/redirectHistory/redir-2.html b/ManualTests/redirectHistory/redir-2.html new file mode 100644 index 0000000..fe9e6ba --- /dev/null +++ b/ManualTests/redirectHistory/redir-2.html 
@@ -0,0 +1,9 @@ +<html> +<head> +<meta http-equiv="refresh" content="0;url=redir-3.html"/> +<title>Redirect 2</title> +</head> +<body> +<p>Test failed</p> +</body> +</html> 
diff --git a/ManualTests/redirectHistory/redir-3.html b/ManualTests/redirectHistory/redir-3.html new file mode 100644 index 0000000..a525851 --- /dev/null +++ b/ManualTests/redirectHistory/redir-3.html 
@@ -0,0 +1,11 @@ +<html> +<head> +<title>Redirect 3</title> +<script> +window.setTimeout("window.history.back()", 1000); +</script> +</head> +<body> +<p>Going back...</p> +</body> +</html> 
diff --git a/ManualTests/redirection-target.html b/ManualTests/redirection-target.html new file mode 100644 index 0000000..365681a --- /dev/null +++ b/ManualTests/redirection-target.html 
@@ -0,0 +1,6 @@ +<p> +This test checks that redirection does not leave Safari thinking it's still loading. +Check that the title bar does not say "Loading" any more. +The bug was <a href="rdar://problem/4432562">4432562</a> in Radar and +<a href="http://bugs.webkit.org/show_bug.cgi?id=7058">7058</a> in Bugzilla. +</p> 
diff --git a/ManualTests/redraw-page-cache-visited-links.html b/ManualTests/redraw-page-cache-visited-links.html new file mode 100644 index 0000000..d13019b --- /dev/null +++ b/ManualTests/redraw-page-cache-visited-links.html 
@@ -0,0 +1,34 @@ +<html> +<head> +<script> +// Uncomment to make this an automated test +//if (window.layoutTestController) { +// layoutTestController.waitUntilDone(); +// layoutTestController.keepWebHistory(); +//} +function runTest() { +// Uncomment to make this an automated test +// // Uses window.history hack; see http://bugs.webkit.org/show_bug.cgi?id=7135 +// if (!window.history[99999]) { +// var element = document.getElementById("mylink"); +// var event = document.createEvent("MouseEvent"); +// event.initEvent("click", true, true); +// element.dispatchEvent(event); +// } +// else { +// if (window.layoutTestController) { +// layoutTestController.notifyDone(); +// } +// } +} +</script> +</head> +<body onload="runTest();"> +<div><a href="http://bugs.webkit.org/show_bug.cgi?id=8079">Bug 8079 REGRESSION: Redraw from page cache does not show visited links</a></div> +<ol> +<li>The link in Step 2 should be rendered in an unvisited link color first. +<li><a id="mylink" href="./resources/redraw-page-cache-visited-links-2.html">Click This Link Once</a><br><br> +<li value="4">The test passes if the link in Step 2 is rendered in a visited link color after the click. +</ol> +</body> +</html> 
diff --git a/ManualTests/remove-add-fixed-position.html b/ManualTests/remove-add-fixed-position.html new file mode 100644 index 0000000..983f13d --- /dev/null +++ b/ManualTests/remove-add-fixed-position.html 
@@ -0,0 +1,93 @@ +<html><head> +<meta name="viewport" content="width=device-width"> +<style> +.d1 {position:fixed; top:5; right:5; z-index:2; overflow:hidden;} +.o {background:green; height:40px; width:200px;} +.t { width:2000px; height:198px; background-color: lightgray; border: 1px solid blue;} +body { margin: 0px; } +</style> +<script> + +var fixed; + +function remove_child() +{ + fixed = document.getElementById("d1"); + fixed.parentElement.removeChild(fixed); +} + +function add_child() +{ + document.body.appendChild(fixed); +} + +</script> +</head> +<body> +<div class="d1" id="d1"><div class="o">This is a test</div></div> +<div class="t"> +000 +</div> +<div class="t"> +200<br> +<button onclick="remove_child();">remove fixed</button> +</div> +<div class="t"> +400<br> +<button onclick="add_child();">add fixed</button> +</div> +<div class="t"> +600<br> +</div> +<div class="t"> +800 +</div> +<div class="t"> +1000 +</div> +<div class="t"> +1200 +</div> +<div class="t"> +1400 +</div> +<div class="t"> +1600 +</div> +<div class="t"> +1800 +</div> +<div class="t"> +2000 +</div> +<div class="t"> +2200 +</div> +<div class="t"> +2400 +</div> +<div class="t"> +2600 +</div> +<div class="t"> +2800 +</div> +<div class="t"> +3000 +</div> +<div class="t"> +3200 +</div> +<div class="t"> +3400 +</div> +<div class="t"> +3600 +</div> +<div class="t"> +3800 +</div> +<div class="t"> +4000 +</div> +</body></html> 
diff --git a/ManualTests/remove-fixed-position-but-keep-compositing.html b/ManualTests/remove-fixed-position-but-keep-compositing.html new file mode 100644 index 0000000..3067fa9 --- /dev/null +++ b/ManualTests/remove-fixed-position-but-keep-compositing.html 
@@ -0,0 +1,46 @@ +<html> + + <body style="height: 10000px"> + + <button id="toggle">Toggle</button> + + <p> + The black rectangle starts fixed, and due to a transform will be composited. Toggle to unfix it and scroll: the black rectangle should scroll with the page and not overlap the numbers. + </p> + + <div id="rect" style="background-color: black; width: 200px; height: 200px; position: fixed; transform: translate3d(0,0,0)"> + </div> + +1<br> +2<br> +3<br> +4<br> +5<br> +6<br> +7<br> +8<br> +9<br> +10<br> +11<br> +12<br> +13<br> +14<br> +15<br> +16<br> +17<br> +18<br> +19<br> +20<br> + +<script> +var rect = document.getElementById("rect"); +var toggle = document.getElementById("toggle"); + +toggle.addEventListener("click", function (ev) { + if (rect.style.position === "fixed") { + rect.style.position = ""; + } else { + rect.style.position = "fixed"; + } +}); +</script> 
diff --git a/ManualTests/remove-form-node-with-radio-buttons-crash.html b/ManualTests/remove-form-node-with-radio-buttons-crash.html new file mode 100644 index 0000000..c2d85de --- /dev/null +++ b/ManualTests/remove-form-node-with-radio-buttons-crash.html 
@@ -0,0 +1,33 @@ +<html> +<script type="text/javascript"> + +function load1() { + var doc = document.getElementById("container"); + doc.innerHTML = "<form name=\"gaga\"><input type=\"radio\" name=\"asdf\" id=\"chk\" value=\"A\"> Checkbox 1" + + "<input type=\"radio\" name=\"asdf\" value=\"B\"> Checkbox 2"; + document.getElementById("chk").checked = true; +} + +function load2() { + var doc = document.getElementById("container"); + doc.innerHTML = "hello, world"; +} + +var ctr = 0; + +function runTest() { + if (ctr % 2 == 0) { + load1(); + } else { + load2(); + } + ctr++; + setTimeout("runTest()", 10); +} +</script> +<body> +<div>This is a test for http://bugs.webkit.org/show_bug.cgi?id=12938 - to test this, press the "Run Test" button and wait for a couple of minutes - the browser should not crash.</div> +<input type="button" onclick="runTest()" value="Run Test"> +<div id="container"/> + +</body></html> 
diff --git a/ManualTests/remove-input-file-onchange.html b/ManualTests/remove-input-file-onchange.html new file mode 100644 index 0000000..80368e3 --- /dev/null +++ b/ManualTests/remove-input-file-onchange.html 
@@ -0,0 +1,42 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script> +function removeDiv() +{ + var parent = document.getElementById("parent"); + var child = document.getElementById("child"); + parent.removeChild(child); +} +</script> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4621649">4621649</a> repro crash: Upload link causes crash on pages.google.com in Frame::nodeForWidget</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ol> +<li> To test this bug, just choose any file +</ol> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Should see the file chooser disappear and the word "Success" will appear +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Safari will crash in WebCore::Frame::nodeForWidget. +</p> + +<div id="parent"> +<div id="child"> +<form> +<input id="theFile" type="file" onchange="removeDiv();"> +</form> +</div> +</div> + + + +</body> +</html> 
diff --git a/ManualTests/remove-on-drop-crash.html b/ManualTests/remove-on-drop-crash.html new file mode 100644 index 0000000..c50adba --- /dev/null +++ b/ManualTests/remove-on-drop-crash.html 
@@ -0,0 +1,10 @@ +<body> +Load <a href="http://www.google.com/">Google</a> and drag the logo onto this page. The second time you drag it on, Safari will crash. +<script> +function deleteSelection() { + document.execCommand("delete"); +} +document.designMode="on"; +document.body.addEventListener("DOMNodeInserted", deleteSelection, false); +</script> +</body> 
diff --git a/ManualTests/remove-select-onchange.html b/ManualTests/remove-select-onchange.html new file mode 100644 index 0000000..51004b5 --- /dev/null +++ b/ManualTests/remove-select-onchange.html 
@@ -0,0 +1,9 @@ +<p>This test shouldn't crash when you pick something from select, even though it removes itself. +</p> +<select id="foo" onchange='sel.parentNode.removeChild(sel)'> +<option>Boom</option> +<option>Shouldn't crash when you pick this.</option> +</select> +<script> +var sel = document.getElementById("foo"); +</script> \ No newline at end of file 
diff --git a/ManualTests/reset-initiatedDrag.html b/ManualTests/reset-initiatedDrag.html new file mode 100644 index 0000000..a1c0770 --- /dev/null +++ b/ManualTests/reset-initiatedDrag.html 
@@ -0,0 +1,27 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=9466">Bugzilla bug 9466</a> Assertion failure when dragging an image from the document into Safari's address bar</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b><br> +1. Drag the apple image into this window&rsquo;s address bar.<br> +2. Choose History &gt; Back to go back to this page.<br> +3. Drag a URL from a TextEdit document into this window. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +In step 3, this window will accept the dragged URL. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +In step 1, Safari will quit unexpectedly due to an assertion failure. Alternatively, +in step 3, this window will not accept the dragged URL. +</p> + +<img src="resources/apple.jpg"> + +</body> +</html> 
diff --git a/ManualTests/resize-events.html b/ManualTests/resize-events.html new file mode 100644 index 0000000..42aebb1 --- /dev/null +++ b/ManualTests/resize-events.html 
@@ -0,0 +1,48 @@ +<html> +<head> + <style> + div.block { height: 100px; border: 1px solid black; margin:10px; } + </style> + <script> + var resizecount = 0; + var loaded = false; + window.onresize = function() { + resizecount++; + document.getElementById('count1').innerHTML = resizecount; + } + </script> +</head> +<body> + <div> + Test how many resize events are emitted during page load and dynamic content generation. + + Do not resize the page. It invalidates the test. + <p style="text-indent: 10px" id=result1> + Resize events (should be 0 or 1): <span id=count1>0</span> + </div> + <div id=expandingblock> + </div> + <script> + var blockcount = 0; + function addBlock() { + var el = document.createElement('div'); + el.setAttribute('class','block'); + document.getElementById('expandingblock').appendChild(el); + if (++blockcount < 30) + setTimeout(addBlock, 20); + else + finish(); + } + function finish() { + var result; + // 0 or 1 resize events are acceptable. + if (resizecount < 2) + result = '<p style="color: green">PASS'; + else + result = '<p style="color: red">FAIL'; + var resultElement = document.getElementById('result1') + resultElement.innerHTML += result; + } + onload = addBlock; + </script> +</body> \ No newline at end of file 
diff --git a/ManualTests/resize-repaint.html b/ManualTests/resize-repaint.html new file mode 100644 index 0000000..7154af5 --- /dev/null +++ b/ManualTests/resize-repaint.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE html> + +<html> +<head> + <style> + .container { + width: 700px; + height: 2000px; + margin: 0 auto; + background-color: silver; + } + </style> + <script> + function doTest() + { + window.scrollTo(0, 400); + window.resizeTo(1000, 600); + } + window.addEventListener('load', doTest, false); + </script> +</head> +<body> + <div class="container"></div> +<pre id="layers">Layer tree goes here</p> +</body> +</html> 
diff --git a/ManualTests/resources/200x100.png b/ManualTests/resources/200x100.png new file mode 100644 index 0000000..f7cf784 --- /dev/null +++ b/ManualTests/resources/200x100.png Binary files differ 
diff --git a/ManualTests/resources/200x200.png b/ManualTests/resources/200x200.png new file mode 100644 index 0000000..35414cd --- /dev/null +++ b/ManualTests/resources/200x200.png Binary files differ 
diff --git a/ManualTests/resources/3dolph.gif b/ManualTests/resources/3dolph.gif new file mode 100644 index 0000000..2a1801f --- /dev/null +++ b/ManualTests/resources/3dolph.gif Binary files differ 
diff --git a/ManualTests/resources/ArrayParameterTestApplet.class b/ManualTests/resources/ArrayParameterTestApplet.class new file mode 100644 index 0000000..0435db6 --- /dev/null +++ b/ManualTests/resources/ArrayParameterTestApplet.class Binary files differ 
diff --git a/ManualTests/resources/ArrayParameterTestApplet.java b/ManualTests/resources/ArrayParameterTestApplet.java new file mode 100644 index 0000000..d145844 --- /dev/null +++ b/ManualTests/resources/ArrayParameterTestApplet.java 
@@ -0,0 +1,89 @@ +import java.applet.Applet; +import java.awt.*; +import java.awt.event.*; + + +public class ArrayParameterTestApplet + extends Applet +{ + public void init() + { + setLayout(new BorderLayout()); + } + + + public void start() + { + } + + + public void stop() + { + } + + + public void destroy() + { + } + + + public void arrayFunction(String [] array) { + System.out.println("arrayFunction called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void booleanFunction(boolean[] array) { + System.out.println("booleanArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } + + public void byteFunction(byte[] array) { + System.out.println("byteArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void charFunction(char[] array) { + System.out.println("charArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void shortFunction(short[] array) { + System.out.println("shortArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void intFunction(int[] array) { + System.out.println("intArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void longFunction(long[] array) { + System.out.println("longArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void floatFunction(float[] array) { + System.out.println("floatArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void doubleFunction(double[] array) { + System.out.println("doubleArray called"); + for (int i = 0; i < array.length; i++) + System.out.println(array[i]); + } +  + public void objectFunction(Applet[] array) { + System.out.println("objectArray called"); + for (int i = 0; i < array.length; i++)  + System.out.println(array[i]); + } +} 
diff --git a/ManualTests/resources/CheckerApplet.class b/ManualTests/resources/CheckerApplet.class new file mode 100644 index 0000000..684aa81 --- /dev/null +++ b/ManualTests/resources/CheckerApplet.class Binary files differ 
diff --git a/ManualTests/resources/CheckerApplet.java b/ManualTests/resources/CheckerApplet.java new file mode 100644 index 0000000..895e33c --- /dev/null +++ b/ManualTests/resources/CheckerApplet.java 
@@ -0,0 +1,21 @@ +import java.applet.Applet; +import java.awt.Color; +import java.awt.Component; + +public class CheckerApplet extends Applet +{ + + public boolean checkVersion() + { + return true; + } + + public void start() + { + setBackground(new Color(255, 255, 255)); + } + + public CheckerApplet() + { + } +} 
diff --git a/ManualTests/resources/Default-port-frame-contents.html b/ManualTests/resources/Default-port-frame-contents.html new file mode 100644 index 0000000..3565b28 --- /dev/null +++ b/ManualTests/resources/Default-port-frame-contents.html 
@@ -0,0 +1,4 @@ +My URL is: <script>document.write(document.URL);</script> +<script> + window.testData = "Sam is SOOOOOO hot!"; +</script> \ No newline at end of file 
diff --git a/ManualTests/resources/DrawMessage.class b/ManualTests/resources/DrawMessage.class new file mode 100644 index 0000000..6de7afc --- /dev/null +++ b/ManualTests/resources/DrawMessage.class Binary files differ 
diff --git a/ManualTests/resources/StringTypeTest.class b/ManualTests/resources/StringTypeTest.class new file mode 100644 index 0000000..3a81287 --- /dev/null +++ b/ManualTests/resources/StringTypeTest.class Binary files differ 
diff --git a/ManualTests/resources/StringTypeTest.java b/ManualTests/resources/StringTypeTest.java new file mode 100644 index 0000000..9b8dd78 --- /dev/null +++ b/ManualTests/resources/StringTypeTest.java 
@@ -0,0 +1,7 @@ +import java.applet.*; + +public class StringTypeTest extends Applet { + public String getString() { + return new String("hello"); + } +} \ No newline at end of file 
diff --git a/ManualTests/resources/TestApplet.class b/ManualTests/resources/TestApplet.class new file mode 100644 index 0000000..05fabdd --- /dev/null +++ b/ManualTests/resources/TestApplet.class Binary files differ 
diff --git a/ManualTests/resources/TestApplet.java b/ManualTests/resources/TestApplet.java new file mode 100644 index 0000000..e4758a3 --- /dev/null +++ b/ManualTests/resources/TestApplet.java 
@@ -0,0 +1,16 @@ +import java.applet.Applet; + +public class TestApplet extends Applet { + public static int MAGIC_NUMBER = 1; + public int field; +  + public void init() + { + field = MAGIC_NUMBER; + } +  + public int method() + { + return MAGIC_NUMBER; + } +} \ No newline at end of file 
diff --git a/ManualTests/resources/alert-and-go-back.html b/ManualTests/resources/alert-and-go-back.html new file mode 100644 index 0000000..55a5b50 --- /dev/null +++ b/ManualTests/resources/alert-and-go-back.html 
@@ -0,0 +1,4 @@ +<script> +history.back(); +alert("Wait a moment and then dismiss this alert. If there is no crash, the test succeeded."); +</script> 
diff --git a/ManualTests/resources/animated-10x.gif b/ManualTests/resources/animated-10x.gif new file mode 100644 index 0000000..56bdb0e --- /dev/null +++ b/ManualTests/resources/animated-10x.gif Binary files differ 
diff --git a/ManualTests/resources/animated-2x.gif b/ManualTests/resources/animated-2x.gif new file mode 100644 index 0000000..71080bd --- /dev/null +++ b/ManualTests/resources/animated-2x.gif Binary files differ 
diff --git a/ManualTests/resources/animated-infinite.gif b/ManualTests/resources/animated-infinite.gif new file mode 100644 index 0000000..8bca4a8 --- /dev/null +++ b/ManualTests/resources/animated-infinite.gif Binary files differ 
diff --git a/ManualTests/resources/apple.jpg b/ManualTests/resources/apple.jpg new file mode 100644 index 0000000..bce4c38 --- /dev/null +++ b/ManualTests/resources/apple.jpg Binary files differ 
diff --git a/ManualTests/resources/before-go-back.html b/ManualTests/resources/before-go-back.html new file mode 100644 index 0000000..10d8dbe --- /dev/null +++ b/ManualTests/resources/before-go-back.html 
@@ -0,0 +1,17 @@ +<html> +<body> +<a href="will-go-back.html"> +Click this link</a> +<br> +<br> +<u>Manual test :</u> +Just click on the link : if the webkit doesn't crash, the test has succeed. +<br> +<u>Details:</u> +This test checks if you can go back to a _blank previously tab-opened page. +<br> +When you click on the above link, one page is loaded and tries to go back. +<br> +If the webkit doesn't meet an assertion failure : this test is successfull. +</body> +</html> 
diff --git a/ManualTests/resources/big-page.html b/ManualTests/resources/big-page.html new file mode 100644 index 0000000..987ea75 --- /dev/null +++ b/ManualTests/resources/big-page.html 
@@ -0,0 +1,2 @@ +<p>This page is large enough to need to be scrolled in a 200x200 frame.</p> +<div style="width: 400px; height: 400px; background-color: blue"></div> 
diff --git a/ManualTests/resources/chrome-bidi-text-window.html b/ManualTests/resources/chrome-bidi-text-window.html new file mode 100644 index 0000000..a2333b7 --- /dev/null +++ b/ManualTests/resources/chrome-bidi-text-window.html 
@@ -0,0 +1,61 @@ +<head> + <meta name="content-type" content="text/html; charset=UTF-8"> + <style> + body { margin-top: 0; } + select { display: block; font-size: 13px; } + div#reference { font: 13px 'Lucida Grande'; text-align: center; height: 24px; } + </style> + <script> + function setTitle(text) + { + document.title = text; + document.getElementById("reference").innerHTML = text; + } + </script> +</head> +<body> +<div id="reference"></div> +<p> + This tests drawing bidirectional text in Windows Safari chrome. +</p> +<p> + Select each item from the list and verify that the window title is + rendered exactly like the selected item. + Pay attention to the ordering of + the characters, the direction of parentheses, diacritics and combining marks, + and shaping of Arabic letters. You can ignore small differences in the overall width + of the text. + For your convenience, the + text to match will be displayed at the top of the window. +</p> +<select onchange="setTitle(item(selectedIndex).innerText)" size="9"> + <option> + First שניה (03) רביעית fifth + </option> + <option> + &#x202b;First שניה (03) רביעית fifth&#x202c; + </option> + <option> + &#x202d;First שניה (03) רביעית fifth&#x202c; + </option> + <option> + &#x202e;First שניה (03) רביעית fifth&#x202c; + </option> + <option> + משהו עם נִקּוּד + </option> + <option> + اللغة العربية + </option> + <option> + Et volia&#x0300: ATSUI! + </option> + <option> + Directional &#x202e;overrides&#x202c; are confusing. + </option> + <option> + She said &ldquo;&#x202b;יש TNT במזוודה!&#x202c;&rdquo; and ran off + </option> +</select> +</body> +</html> 
diff --git a/ManualTests/resources/containsAnimatedGif.html b/ManualTests/resources/containsAnimatedGif.html new file mode 100644 index 0000000..77b2cbf --- /dev/null +++ b/ManualTests/resources/containsAnimatedGif.html 
@@ -0,0 +1,3 @@ +<html> +<img src="http://127.0.0.1:8000/misc/resources/animated-gif-with-offsets.gif" /> +</html> 
diff --git a/ManualTests/resources/cur-hotspot.cur b/ManualTests/resources/cur-hotspot.cur new file mode 100644 index 0000000..8107e47 --- /dev/null +++ b/ManualTests/resources/cur-hotspot.cur Binary files differ 
diff --git a/ManualTests/resources/cursor-empty-url.css b/ManualTests/resources/cursor-empty-url.css new file mode 100644 index 0000000..0479af1 --- /dev/null +++ b/ManualTests/resources/cursor-empty-url.css 
@@ -0,0 +1 @@ +#target { cursor: url(''), auto; } 
diff --git a/ManualTests/resources/drag-image.png b/ManualTests/resources/drag-image.png new file mode 100644 index 0000000..a229616 --- /dev/null +++ b/ManualTests/resources/drag-image.png Binary files differ 
diff --git a/ManualTests/resources/drop-in-empty-doc.xhtml b/ManualTests/resources/drop-in-empty-doc.xhtml new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ManualTests/resources/drop-in-empty-doc.xhtml 
diff --git a/ManualTests/resources/empty-document-goes-back.html b/ManualTests/resources/empty-document-goes-back.html new file mode 100644 index 0000000..f8f15b7 --- /dev/null +++ b/ManualTests/resources/empty-document-goes-back.html 
@@ -0,0 +1,8 @@ +<html> +<body> +<script> + document.body.offsetWidth; + setTimeout("window.history.back();", 0); +</script> +</body> +</html> 
diff --git a/ManualTests/resources/empty-file.js b/ManualTests/resources/empty-file.js new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ManualTests/resources/empty-file.js 
diff --git a/ManualTests/resources/favicon-loads-for-local-files.html b/ManualTests/resources/favicon-loads-for-local-files.html new file mode 100644 index 0000000..b8e875f --- /dev/null +++ b/ManualTests/resources/favicon-loads-for-local-files.html 
@@ -0,0 +1,10 @@ +<html> +<head> +</head> +<link type="image/png" href="favicon.png" sizes="64x64" rel="icon" /> +<body> +<p>It's expected that you see a favicon displayed for this page when you open it as a local file.</p> +<p>The favicon looks like this:</p> +<img src="favicon.png"/> +</body> +</html> 
diff --git a/ManualTests/resources/favicon.png b/ManualTests/resources/favicon.png new file mode 100644 index 0000000..35717cc --- /dev/null +++ b/ManualTests/resources/favicon.png Binary files differ 
diff --git a/ManualTests/resources/frame-textarea.html b/ManualTests/resources/frame-textarea.html new file mode 100644 index 0000000..54a3e09 --- /dev/null +++ b/ManualTests/resources/frame-textarea.html 
@@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> +<body> + <textarea>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nulla est, tincidunt pharetra hendrerit nec, ultrices non mi. Fusce feugiat tempus mollis. Nulla sapien augue, iaculis sit amet ornare vitae, ultricies non ante. Aliquam dignissim porta dolor, ac laoreet lectus faucibus ac. Phasellus luctus eros in erat fermentum rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec venenatis bibendum quam. + +Cras vel tellus tellus, accumsan malesuada erat. Mauris tincidunt fermentum massa sit amet ornare. Sed pellentesque ultrices sapien, non cursus felis vestibulum id. Integer vitae enim nec lacus hendrerit consequat id in purus. Suspendisse porta, enim nec congue auctor, nisi augue vulputate magna, eu sollicitudin elit felis id erat. Curabitur in ante elit, et lobortis nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean gravida odio non nulla porta convallis. + </textarea> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/resources/frame1.html b/ManualTests/resources/frame1.html new file mode 100644 index 0000000..50f3b98 --- /dev/null +++ b/ManualTests/resources/frame1.html 
@@ -0,0 +1,8 @@ +<html> +<head> +<title>frame1</title> +</head> +<body> +Frame 1 +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/resources/frame2.html b/ManualTests/resources/frame2.html new file mode 100644 index 0000000..d74db38 --- /dev/null +++ b/ManualTests/resources/frame2.html 
@@ -0,0 +1,8 @@ +<html> +<head> +<title>frame2</title> +</head> +<body> +Frame 2 +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/resources/hash-ref-test.html b/ManualTests/resources/hash-ref-test.html new file mode 100644 index 0000000..ed45778 --- /dev/null +++ b/ManualTests/resources/hash-ref-test.html 
@@ -0,0 +1,24 @@ +<html> +<head> +<title>Test Case for Bug 13067: Manually adding #hash to URL reloads entire page instead of jumping to #hash location in cached page</title> +<style> +body { + min-height: 10000px; + margin-top: 0px; + padding-top: 0px; +} +div { + min-height: 100px; + border: 1px solid black; +} +</style> +</head> +<body> +top +<div id="div1">div1</div> +<div id="div2">div2</div> +<div id="div3">div3</div> +<div id="div4">div4</div> +<div id="div5">div5</div> +</body> +</html> 
diff --git a/ManualTests/resources/helpCursor.tiff b/ManualTests/resources/helpCursor.tiff new file mode 100644 index 0000000..20b56b9 --- /dev/null +++ b/ManualTests/resources/helpCursor.tiff Binary files differ 
diff --git a/ManualTests/resources/hover-subframe-1.html b/ManualTests/resources/hover-subframe-1.html new file mode 100644 index 0000000..181956b --- /dev/null +++ b/ManualTests/resources/hover-subframe-1.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> +<head> +<style> +body { margin: 0px; } +.outer { + margin: -100px; +	width: 400px; + height: 500px; +	background-color: yellow; +} +.outer:hover { + background-color: red; +} +.inner { +	visibility: hidden; +	width: 100%; +	height: 50%; +	background-color: cyan; +} +</style> +</head> + +<body> +<div class="outer"  + onmouseover="firstChild.style.visibility='visible'"  + onmouseout="firstChild.style.visibility='hidden'"><div class="inner"></div></div> +</body> +</html> 
diff --git a/ManualTests/resources/hover-subframe-2.html b/ManualTests/resources/hover-subframe-2.html new file mode 100644 index 0000000..ca4ca40 --- /dev/null +++ b/ManualTests/resources/hover-subframe-2.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> +<head> +<style> +body { margin: 0px; } +.outer { + margin: -100px; +	width: 400px; + height: 500px; +	background-color: green; +} +.outer:hover { + background-color: red; +} +.inner { +	visibility: hidden; +	width: 100%; +	height: 50%; +	background-color: cyan; +} +</style> +</head> + +<body> +<div class="outer"  + onmouseover="firstChild.style.visibility='visible'"  + onmouseout="firstChild.style.visibility='hidden'"><div class="inner"></div></div> +</body> +</html> 
diff --git a/ManualTests/resources/iframe-reloaded-on-touch.html b/ManualTests/resources/iframe-reloaded-on-touch.html new file mode 100644 index 0000000..0fa98c5 --- /dev/null +++ b/ManualTests/resources/iframe-reloaded-on-touch.html 
@@ -0,0 +1,3 @@ +<body> +<div ontouchstart="window.location.reload()" style="background-color:green;height:200px;width:200px">Touch me</div> +</body> 
diff --git a/ManualTests/resources/large-size-image-crash.gif b/ManualTests/resources/large-size-image-crash.gif new file mode 100644 index 0000000..6da80af --- /dev/null +++ b/ManualTests/resources/large-size-image-crash.gif Binary files differ 
diff --git a/ManualTests/resources/liveconnect-security-exception-popup.html b/ManualTests/resources/liveconnect-security-exception-popup.html new file mode 100644 index 0000000..cea621b --- /dev/null +++ b/ManualTests/resources/liveconnect-security-exception-popup.html 
@@ -0,0 +1,47 @@ +<html> +<head> +<!-- +Sorry for the hackery in this test. Currently, we have no elegant way to +catch Java errors and print out an intelligent response. +--> + +<title>popup window</title> +<script> +function print(message) { +	var paragraph = document.createElement("p"); +	paragraph.appendChild(document.createTextNode(message)); +	document.getElementById("console").appendChild(paragraph); +} + +function test() { +	if (window.layoutTestController) { +	layoutTestController.dumpAsText(); +	} + + print( + "applet.field returned " +  + document.getElementById('applet').field + ); + + document.getElementById('applet').field += 1; + print( + "incremented applet.field by 1" + ); +  + print( + "applet.field returned " +  + document.getElementById('applet').field + ); + + print( + "applet.method() returned " +  + document.getElementById('applet').method() + ); +} +</script> +</head> +<body onload="test();"> +<applet id='applet' code="TestApplet.class" codebase="."></applet> +<div id='console'/> +</body> +</html> 
diff --git a/ManualTests/resources/load-deferrer-script-element.js b/ManualTests/resources/load-deferrer-script-element.js new file mode 100644 index 0000000..fdecdb4 --- /dev/null +++ b/ManualTests/resources/load-deferrer-script-element.js 
@@ -0,0 +1,5 @@ +if (jsLoaded) { + log("Button was clicked."); + // Use a big timeout value to ensure that error messages do not show up. + setTimeout(function() { if (runningModal) log("Error: This line should not show up!"); }, 3000); +} 
diff --git a/ManualTests/resources/lorem-text.html b/ManualTests/resources/lorem-text.html new file mode 100644 index 0000000..12a42a6 --- /dev/null +++ b/ManualTests/resources/lorem-text.html 
@@ -0,0 +1,34 @@ +<HTML><HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-8"></HEAD><BODY><P>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam + nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, + sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem + ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing + elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo + dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus + est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur + sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et + dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam + et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea + takimata sanctus est Lorem ipsum dolor sit amet. + </P> + <P> Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse + molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero + eros et accumsan et iusto odio dignissim qui blandit praesent luptatum + zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum + dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh + euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + </P> + <P> Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper + suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem + vel eum iriure dolor in hendrerit in vulputate velit esse molestie + consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et + accumsan et iusto odio dignissim qui blandit praesent luptatum zzril + delenit augue duis dolore te feugait nulla facilisi. + </P> + <P> Nam liber tempor cum soluta nobis eleifend option congue nihil + imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum + dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh + euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut + wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper + suscipit lobortis nisl ut aliquip ex ea commodo consequat.</P></BODY></HTML> \ No newline at end of file 
diff --git a/ManualTests/resources/mouseevent-on-closeddoc.html b/ManualTests/resources/mouseevent-on-closeddoc.html new file mode 100644 index 0000000..569616a --- /dev/null +++ b/ManualTests/resources/mouseevent-on-closeddoc.html 
@@ -0,0 +1 @@ +<body onload="document.open();document.close();document.open();"></body> 
diff --git a/ManualTests/resources/multiFileResources/post-echo-and-notify-done.cgi b/ManualTests/resources/multiFileResources/post-echo-and-notify-done.cgi new file mode 100755 index 0000000..9003672 --- /dev/null +++ b/ManualTests/resources/multiFileResources/post-echo-and-notify-done.cgi 
@@ -0,0 +1,12 @@ +#!/usr/bin/perl -w + +print "Content-type: text/html\n\n";  + +if ($ENV{'REQUEST_METHOD'} eq "POST") { + read(STDIN, $request, $ENV{'CONTENT_LENGTH'}) + || die "Could not get query\n"; + print "<pre>$request</pre>"; + print "<script>if (window.testRunner) testRunner.notifyDone();</script>"; +} else { + print "Wrong method: " . $ENV{'REQUEST_METHOD'} . "\n"; +}  
diff --git a/ManualTests/resources/multiFileResources/testFile1.html b/ManualTests/resources/multiFileResources/testFile1.html new file mode 100644 index 0000000..4313554 --- /dev/null +++ b/ManualTests/resources/multiFileResources/testFile1.html 
@@ -0,0 +1,4 @@ +<script> +parent.log('test file 1 submitted'); +parent.submittedFiles++; +</script> \ No newline at end of file 
diff --git a/ManualTests/resources/multiFileResources/testFile2.html b/ManualTests/resources/multiFileResources/testFile2.html new file mode 100644 index 0000000..90167f7 --- /dev/null +++ b/ManualTests/resources/multiFileResources/testFile2.html 
@@ -0,0 +1,4 @@ +<script> +parent.log('test file 2 submitted'); +parent.submittedFiles++; +</script> \ No newline at end of file 
diff --git a/ManualTests/resources/multiFileResources/testFile3.html b/ManualTests/resources/multiFileResources/testFile3.html new file mode 100644 index 0000000..f89ddf3 --- /dev/null +++ b/ManualTests/resources/multiFileResources/testFile3.html 
@@ -0,0 +1,5 @@ +<script> +parent.log('test file 3 submitted'); +parent.submittedFiles++; +parent.verifyResults(); +</script> \ No newline at end of file 
diff --git a/ManualTests/resources/named-window-blank-target-step2.html b/ManualTests/resources/named-window-blank-target-step2.html new file mode 100644 index 0000000..0275603 --- /dev/null +++ b/ManualTests/resources/named-window-blank-target-step2.html 
@@ -0,0 +1,19 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=7747">Bugzilla bug 7747</a> REGRESSION: Background tab/window auto-refresh in GMail will take focus.</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST (continued):</b> <br> +STEP 3: Click <a target="foo" href="named-window-blank-target-step3.html">this link</a>. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If this window is frontmost after STEP 4, then the test FAILED. +</p> + + +</body> +</html> 
diff --git a/ManualTests/resources/named-window-blank-target-step3.html b/ManualTests/resources/named-window-blank-target-step3.html new file mode 100644 index 0000000..c510522 --- /dev/null +++ b/ManualTests/resources/named-window-blank-target-step3.html 
@@ -0,0 +1,14 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=7747">Bugzilla bug 7747</a> REGRESSION: Background tab/window auto-refresh in GMail will take focus.</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +STEP 4: Click <a href="named-window-blank-target-step4.html">this link</a>.  +</p> + +</body> +</html> 
diff --git a/ManualTests/resources/named-window-blank-target-step4.html b/ManualTests/resources/named-window-blank-target-step4.html new file mode 100644 index 0000000..ee07450 --- /dev/null +++ b/ManualTests/resources/named-window-blank-target-step4.html 
@@ -0,0 +1,14 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=7747">Bugzilla bug 7747</a> REGRESSION: Background tab/window auto-refresh in GMail will take focus.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +If this window is frontmost after STEP 4, the test PASSED. +</p> + +</body> +</html> 
diff --git a/ManualTests/resources/navigation-during-onload-container.html b/ManualTests/resources/navigation-during-onload-container.html new file mode 100644 index 0000000..cbeb992 --- /dev/null +++ b/ManualTests/resources/navigation-during-onload-container.html 
@@ -0,0 +1,10 @@ +<script> +onload = function() { + window.location.replace("#foo"); +}; +</script> +container +<iframe src="http://127.0.0.1:8000/history/resources/back-during-onload-middle.html"></iframe> +<p> +Click the back button and see if the browser crashes. +</p> 
diff --git a/ManualTests/resources/nested-plugins-inner-frame.html b/ManualTests/resources/nested-plugins-inner-frame.html new file mode 100644 index 0000000..193bbe9 --- /dev/null +++ b/ManualTests/resources/nested-plugins-inner-frame.html 
@@ -0,0 +1 @@ +<embed id="plugin" width='100' height='100' src='spinbox.swf' wmode='window'> 
diff --git a/ManualTests/resources/nested-plugins-outer-frame.html b/ManualTests/resources/nested-plugins-outer-frame.html new file mode 100644 index 0000000..ea8cbd9 --- /dev/null +++ b/ManualTests/resources/nested-plugins-outer-frame.html 
@@ -0,0 +1,3 @@ +<embed id="plugin" width='100' height='100' src='spinbox.swf' wmode='window'> +<br> +<iframe style="height: 200px; width: 200px;" id='inner' src='nested-plugins-inner-frame.html'></iframe> 
diff --git a/ManualTests/resources/nestedframesets.html b/ManualTests/resources/nestedframesets.html new file mode 100644 index 0000000..3202fc0 --- /dev/null +++ b/ManualTests/resources/nestedframesets.html 
@@ -0,0 +1,4 @@ +<frameset cols="300,300" rows="*">  + <frame src="testframeset.html" > + <frame src="lorem-text.html"> +</frameset> \ No newline at end of file 
diff --git a/ManualTests/resources/non-animated.gif b/ManualTests/resources/non-animated.gif new file mode 100644 index 0000000..b6a8540 --- /dev/null +++ b/ManualTests/resources/non-animated.gif Binary files differ 
diff --git a/ManualTests/resources/open-after-close-popup.html b/ManualTests/resources/open-after-close-popup.html new file mode 100644 index 0000000..4f443d0 --- /dev/null +++ b/ManualTests/resources/open-after-close-popup.html 
@@ -0,0 +1,5 @@ +<html> + <body> + PASS: window.open succeeded after window.close using same name. + </body> +</html> 
diff --git a/ManualTests/resources/open-close-tokenizer-crash.html b/ManualTests/resources/open-close-tokenizer-crash.html new file mode 100644 index 0000000..b45110a --- /dev/null +++ b/ManualTests/resources/open-close-tokenizer-crash.html 
@@ -0,0 +1,8 @@ +<html> +<head> +<script Language="javaScript"> +self.close(); +</script> +<script language="javascript" src="empty-file.js"></script> +</head> +</html> 
diff --git a/ManualTests/resources/orange.mov b/ManualTests/resources/orange.mov new file mode 100644 index 0000000..a17e81b --- /dev/null +++ b/ManualTests/resources/orange.mov Binary files differ 
diff --git a/ManualTests/resources/plain-text-paste.dmg b/ManualTests/resources/plain-text-paste.dmg new file mode 100644 index 0000000..f22188d --- /dev/null +++ b/ManualTests/resources/plain-text-paste.dmg Binary files differ 
diff --git a/ManualTests/resources/plugin-in-iframe-scroll-iframe.html b/ManualTests/resources/plugin-in-iframe-scroll-iframe.html new file mode 100644 index 0000000..b2593b0 --- /dev/null +++ b/ManualTests/resources/plugin-in-iframe-scroll-iframe.html 
@@ -0,0 +1,6 @@ +<object type="video/quicktime" style="background-color: red; width: 298px; height: 298px; border:solid 1px"> + <param name="src" value="orange.mov"> + <param name="controller" value="false"> + <param name="autoplay" value="false"> + <param name="scale" value="tofit"> +</object> 
diff --git a/ManualTests/resources/popup200x100.html b/ManualTests/resources/popup200x100.html new file mode 100644 index 0000000..7e649c0 --- /dev/null +++ b/ManualTests/resources/popup200x100.html 
@@ -0,0 +1,8 @@ +<html> +<head> +<title>Popup 200x100</title> +</head> +<body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginheight="0" marginwidth="0"> +<img src="200x100.png" width="200" height="100"> +</body> +</html> 
diff --git a/ManualTests/resources/popup200x200.html b/ManualTests/resources/popup200x200.html new file mode 100644 index 0000000..c569c0c --- /dev/null +++ b/ManualTests/resources/popup200x200.html 
@@ -0,0 +1,8 @@ +<html> +<head> +<title>Popup 100x100</title> +</head> +<body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginheight="0" marginwidth="0"> +<img src="200x200.png" width="200" height="200"> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/resources/print-subframe.html b/ManualTests/resources/print-subframe.html new file mode 100644 index 0000000..272b684 --- /dev/null +++ b/ManualTests/resources/print-subframe.html 
@@ -0,0 +1 @@ +<p>This text in the subframe should be printed.</p> 
diff --git a/ManualTests/resources/redraw-page-cache-visited-links-2.html b/ManualTests/resources/redraw-page-cache-visited-links-2.html new file mode 100644 index 0000000..c6568dc --- /dev/null +++ b/ManualTests/resources/redraw-page-cache-visited-links-2.html 
@@ -0,0 +1,19 @@ +<html> +<head> +<script> +function runTest() { +// Uncomment to make this an automated test +// // Uses window.history hack; see http://bugs.webkit.org/show_bug.cgi?id=7135 +// window.history[99999] = 1; +// window.history.back(); +} +</script> +</head> +<body onload="runTest();"> +<div><a href="http://bugs.webkit.org/show_bug.cgi?id=8079">Bug 8079 REGRESSION: Redraw from page cache does not show visited links</a></div> +<div><br><br></div> +<ol> +<li value="3">Click the "Back" button on the browser. +</ol> +</body> +</html> 
diff --git a/ManualTests/resources/simple-iframe.html b/ManualTests/resources/simple-iframe.html new file mode 100644 index 0000000..d31caf4 --- /dev/null +++ b/ManualTests/resources/simple-iframe.html 
@@ -0,0 +1,5 @@ +<html> +<body> + <div style="width:600; height:1000; background-color:purple;"></div> +</body> +</html> 
diff --git a/ManualTests/resources/simple_image.png b/ManualTests/resources/simple_image.png new file mode 100644 index 0000000..4685399 --- /dev/null +++ b/ManualTests/resources/simple_image.png Binary files differ 
diff --git a/ManualTests/resources/spinbox.swf b/ManualTests/resources/spinbox.swf new file mode 100644 index 0000000..220d00a --- /dev/null +++ b/ManualTests/resources/spinbox.swf Binary files differ 
diff --git a/ManualTests/resources/testframe-link_text.html b/ManualTests/resources/testframe-link_text.html new file mode 100644 index 0000000..24c862d --- /dev/null +++ b/ManualTests/resources/testframe-link_text.html 
@@ -0,0 +1,5 @@ +<p title="Can you see this title?" style="margin-left: -10px; margin-top: -15px;"><a href="http://www.google.com">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur dui nunc, tristique a, varius commodo, pellentesque in, augue. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Curabitur vehicula ante et nisl. Sed vitae sapien. Quisque turpis. Nullam libero urna, semper quis, tincidunt a, aliquam eget, nulla. Proin sollicitudin, purus ut aliquet imperdiet, eros tortor vehicula ante, id rutrum erat sapien ut sem. Mauris urna velit, scelerisque vitae, aliquam non, venenatis vitae, nibh. In nunc massa, commodo in, imperdiet vitae, tempor ut, neque. Suspendisse pharetra, mauris in scelerisque iaculis, tellus magna tempus elit, eget ultricies libero magna eget tortor. Suspendisse nibh quam, commodo sit amet, bibendum dapibus, sollicitudin eu, nisi. Vestibulum ipsum. Sed eget odio at ante iaculis fermentum. Quisque sed velit. Cras adipiscing, felis sed sodales dictum, felis neque dictum ante, ac dignissim leo nibh id erat. Sed consectetuer, ligula quis faucibus tincidunt, mauris lorem tempor justo, et ultricies nisi enim sit amet eros. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam dictum posuere augue. Sed fringilla. Nunc nunc. + +Suspendisse fringilla dui quis libero. Vestibulum ipsum erat, dictum eu, sodales et, pharetra nec, nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec ac turpis eget dolor facilisis commodo. Nunc augue. Quisque in mauris ac nunc mollis dictum. In hac habitasse platea dictumst. Cras sed nisl at purus mattis suscipit. Suspendisse potenti. Maecenas vel dui. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Sed pede nisl, tristique ac, convallis vitae, mattis et, ante. Maecenas tortor. Suspendisse pulvinar ullamcorper pede. Praesent ac lacus. Integer sapien massa, tempus at, interdum ut, fermentum vitae, mi. Nullam pulvinar eros id purus. Duis velit quam, dictum ac, gravida ut, luctus id, dui. Nam id neque. + +Aliquam vitae tortor sed massa aliquam pellentesque. Aliquam erat volutpat. Donec sem. Duis lacus. Mauris magna velit, feugiat vel, interdum sit amet, viverra vitae, leo. Fusce lectus arcu, lacinia tempor, sodales vitae, mollis nec, turpis. Donec et elit consequat ligula egestas aliquam. Aliquam a turpis. Phasellus quis magna. Pellentesque vehicula, ligula ac tristique sodales, odio arcu mollis lorem, a vestibulum quam ipsum ut orci. In accumsan malesuada nibh. Quisque accumsan, augue non egestas egestas, nibh arcu varius nunc, at ornare ipsum libero et eros.</a></p> \ No newline at end of file 
diff --git a/ManualTests/resources/testframeset.html b/ManualTests/resources/testframeset.html new file mode 100644 index 0000000..4d907e4 --- /dev/null +++ b/ManualTests/resources/testframeset.html 
@@ -0,0 +1,4 @@ +<frameset rows="244,516" cols="*">  + <frame src="testframe-link_text.html" > + <frame src="http://www.google.com"> +</frameset> \ No newline at end of file 
diff --git a/ManualTests/resources/textarea-form-back-on-submit.html b/ManualTests/resources/textarea-form-back-on-submit.html new file mode 100644 index 0000000..2348e2d --- /dev/null +++ b/ManualTests/resources/textarea-form-back-on-submit.html 
@@ -0,0 +1,16 @@ +<html> +<head> +<title>Form with a textarea that goes back on submit</title> +</head> +<body> +<form id="form" method="get" action="data:text/html,<body onload='history.back()'></body>"> + <p> + <textarea name="text" rows="3" cols="10" id="textarea">123</textarea><br /> + <br /> + <input type="submit" /> + <input type="reset" /> + </p> +</form> + +</body> +</html> 
diff --git a/ManualTests/resources/touch-poster.png b/ManualTests/resources/touch-poster.png new file mode 100644 index 0000000..781c85a --- /dev/null +++ b/ManualTests/resources/touch-poster.png Binary files differ 
diff --git a/ManualTests/resources/video-tab.html b/ManualTests/resources/video-tab.html new file mode 100644 index 0000000..fec915f --- /dev/null +++ b/ManualTests/resources/video-tab.html 
@@ -0,0 +1 @@ +<video src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov" controls autoplay> 
diff --git a/ManualTests/resources/webkit-background.png b/ManualTests/resources/webkit-background.png new file mode 100644 index 0000000..6213bf5 --- /dev/null +++ b/ManualTests/resources/webkit-background.png Binary files differ 
diff --git a/ManualTests/resources/will-go-back.html b/ManualTests/resources/will-go-back.html new file mode 100644 index 0000000..5d09ba3 --- /dev/null +++ b/ManualTests/resources/will-go-back.html 
@@ -0,0 +1,11 @@ +<html> +<script> +function goBack() { + history.back(); +} +</script> + +<body onload="if (!window.layoutTestController) goBack();"> +If you can go back using the history : test has succeed. +</body> +</html> 
diff --git a/ManualTests/resources/window-close-during-parsing-popup1.html b/ManualTests/resources/window-close-during-parsing-popup1.html new file mode 100644 index 0000000..249cea8 --- /dev/null +++ b/ManualTests/resources/window-close-during-parsing-popup1.html 
@@ -0,0 +1,11 @@ +<html> +<body onload="alert('FAIL: onload fired')" onunload="alert('FAIL: onunload fired')"> +<script> +window.close(); +alert('PASS: same script tag after close'); +</script> +<script> +alert('FAIL: different script tag after close'); +</script> +</body> +</html> 
diff --git a/ManualTests/resources/window-close-during-parsing-popup2.html b/ManualTests/resources/window-close-during-parsing-popup2.html new file mode 100644 index 0000000..9d0e682 --- /dev/null +++ b/ManualTests/resources/window-close-during-parsing-popup2.html 
@@ -0,0 +1,7 @@ +<html> +<body onload="window.print()"> +<script> +window.close() +</script> +</body> +</html> 
diff --git a/ManualTests/resources/write-after-open-popup.html b/ManualTests/resources/write-after-open-popup.html new file mode 100644 index 0000000..ca73200 --- /dev/null +++ b/ManualTests/resources/write-after-open-popup.html 
@@ -0,0 +1,5 @@ +<html> + <body> + FAIL: document.write should clear this text. + </body> +</html> \ No newline at end of file 
diff --git a/ManualTests/resources/zh-hans.png b/ManualTests/resources/zh-hans.png new file mode 100644 index 0000000..2aef636 --- /dev/null +++ b/ManualTests/resources/zh-hans.png Binary files differ 
diff --git a/ManualTests/resources/zh-hant.png b/ManualTests/resources/zh-hant.png new file mode 100644 index 0000000..1e06d51 --- /dev/null +++ b/ManualTests/resources/zh-hant.png Binary files differ 
diff --git a/ManualTests/right-click-crash.html b/ManualTests/right-click-crash.html new file mode 100644 index 0000000..75e2ac2 --- /dev/null +++ b/ManualTests/right-click-crash.html 
@@ -0,0 +1,6 @@ +<html><head><script> +document.onmousedown = function () { alert("Dismiss this and quickly right click again."); }; +</script></head><body>This page is intended to test crashes caused by repeated right clicks. +To try to reproduce the bug, right click and then dismiss the dialog by hitting Return. +Do it over and over again in quick succession. The test passes if you don't see a crash. +See <a href="https://bugs.webkit.org/show_bug.cgi?id=24049">WebKit bug 24049</a> for details.</body></html> 
diff --git a/ManualTests/screen-availLeft.html b/ManualTests/screen-availLeft.html new file mode 100644 index 0000000..e8d9f39 --- /dev/null +++ b/ManualTests/screen-availLeft.html 
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> + <script type="text/javascript"> + function log(s) + { + var output = document.getElementById('output'); + output.innerHTML += s + "<br>"; + } +  + function doTest() + { + window.setInterval(function() { +  + var screen = window.screen; + log('screen availLeft: ' + screen.availLeft + ' availTop: ' + screen.availTop); +  + }, 1000); + } + window.addEventListener('load', doTest, false); + </script> +</head> +<body> + <p>On a two-monitor system, configure the menu bar to be on the right screen. Then drag this window between screens. When on the left screen, screen.availLeft should be negative.</p> + <div id="output"></div> +</body> +</html> 
diff --git a/ManualTests/scroll-wheel-select-element.html b/ManualTests/scroll-wheel-select-element.html new file mode 100644 index 0000000..650be17 --- /dev/null +++ b/ManualTests/scroll-wheel-select-element.html 
@@ -0,0 +1,14 @@ +<!--- Verify that a large drop-down paints properly when scrolling it with the mousewheel --> +<script> + window.onload = function() { + var frag = document.createDocumentFragment(); + for (var i = 0; i < 100; i++) { + var opt = document.createElement('option'); + opt.textContent = 'option ' + i; + frag.appendChild(opt); + } + var select = document.querySelector('select'); + select.appendChild(frag); + } +</script> +<select></select> 
diff --git a/ManualTests/scrollIntoView-horizontal.html b/ManualTests/scrollIntoView-horizontal.html new file mode 100644 index 0000000..1cb909c --- /dev/null +++ b/ManualTests/scrollIntoView-horizontal.html 
@@ -0,0 +1,33 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID</b> <a href="rdar://problem/3471901">3471901</a> support scrollIntoView method for DOM elements (3474)</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Following the numbered steps on each button, click each button to scroll the next button into view.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Next button scrolls into view as specified.</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Next button does not scroll into view, or the button is scrolled to the wrong positon (top, bottom).  +</p> + + +<input id="topleft" type="button" value="STEP 1: click to horizontally scroll STEP 2 into view" onclick="document.getElementById('topright').scrollIntoView(false);"> + +<input id="topright" type="button" value="STEP 2: click to scroll STEP 3 to BOTTOM of view" style="position: absolute; left: 1200px;" onclick="document.getElementById('bottomleft').scrollIntoView(false);"> + +<div style="height: 500px; width: 1200px; border: 1px solid;">here is a big empty div</div> + +<input id="bottomleft" type="button" value="STEP 3: click to scroll STEP 4 to TOP of view" style="position: absolute; top: 1200px;" onclick="document.getElementById('bottomright').scrollIntoView(true);"> + +<input id="bottomright" type="button" value="STEP 4: click to scroll STEP 1 to TOP of view (then you're done)" style="position: absolute; top: 1200px; left: 1200px;" onclick="document.getElementById('topleft').scrollIntoView();"> + +<div style="height: 500px; width: 1200px; border: 1px solid; position: absolute; top: 1300px;">here is a big empty div</div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/scrollIntoView-vertical.html b/ManualTests/scrollIntoView-vertical.html new file mode 100644 index 0000000..0d8525a --- /dev/null +++ b/ManualTests/scrollIntoView-vertical.html 
@@ -0,0 +1,45 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID</b> <a href="rdar://problem/3471901">3471901</a> support scrollIntoView method for DOM elements (3474)</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Following the numbered steps, click each button to scroll the specified colored box into view.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +A colored box should scroll into view after clicking each button. The text on the button specifies the expected position (top, bottom) of the box scrolled into view.</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Colored box does not scroll into view, or the box is scrolled to the wrong positon (top, bottom).  +</p> + +<div id="purplebox" style="background-color:purple; width: 300px; height: 100px;"> +	<input type="button" value="STEP 1: click to scroll yellow box to BOTTOM of view" onclick="document.getElementById('yellowbox').scrollIntoView(false);"> +	<input type="button" value="STEP 4: click to scroll orange box to TOP of view" onclick="document.getElementById('orangebox').scrollIntoView(true);"> +</div> + +<div style="height: 500px; width: 500px; border: 1px solid;">here is a big empty div</div> + +<div id="greenbox" style="background-color:green; width: 300px; height: 100px;"> +	<input type="button" value="STEP 3: click to scroll purple box to TOP of view" onclick="document.getElementById('purplebox').scrollIntoView();"> +</div> + +<div style="height: 500px; width: 500px; border: 1px solid;">here is a big empty div</div> + +<div id="yellowbox" style="background-color:yellow; width: 300px; height: 100px;"> +	<input type="button" value="STEP 2: click to scroll green box to TOP of view" onclick="document.getElementById('greenbox').scrollIntoView(true);"> +</div> + +<div style="height: 500px; width: 500px; border: 1px solid;">here is a big empty div</div> + +<div id="orangebox" style="background-color:orange; width: 300px; height: 100px;"> + Test Complete +</div> + +<div style="height: 500px; width: 500px; border: 1px solid;">here is a big empty div</div> + +</body> +</html> 
diff --git a/ManualTests/scrollable-positioned-frame.html b/ManualTests/scrollable-positioned-frame.html new file mode 100644 index 0000000..56f80f3 --- /dev/null +++ b/ManualTests/scrollable-positioned-frame.html 
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<html> +<body> + <p>The contents of this frame should scroll with the mouse wheel.</p> + <iframe width=200 scrolling=yes src="resources/frame-textarea.html" style="position:fixed; left: 200px" id="frame"></iframe> +</body> +</html> 
diff --git a/ManualTests/scrollable-positioned-nested-frame.html b/ManualTests/scrollable-positioned-nested-frame.html new file mode 100644 index 0000000..4e53bbb --- /dev/null +++ b/ManualTests/scrollable-positioned-nested-frame.html 
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<html> +<body> + <p>The contents of this frame should scroll with the mouse wheel.</p> + <iframe width=400 scrolling=yes src="scrollable-positioned-frame.html" style="position:fixed; left: 200px" id="frame"></iframe> +</body> +</html> 
diff --git a/ManualTests/scrollbar-crash-on-hide-scrolled-area.html b/ManualTests/scrollbar-crash-on-hide-scrolled-area.html new file mode 100644 index 0000000..4fb8f57 --- /dev/null +++ b/ManualTests/scrollbar-crash-on-hide-scrolled-area.html 
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"/> + <title>QuickStart</title> + <style> + .lessonChapters { + position:absolute; + top:26px; + bottom:22px; + overflow:auto; + } + #hint { + height:9000px; + } +</style> +<script> + function runTest() + { + document.getElementById('lessons').scrollTop = 10000; + document.getElementById('toHide').style.display='none'; + } +</script> +</head> + +<body onload="runTest();"> + +<div class="lessonChapters" id="lessons"> +<div class="lessonChapter" id="toHide"> + <br /> + Manual repro: scroll down and click on <b>Next step</b> + <div id="hint">&nbsp;</div> + <a href="#" class="nextStepButton" onclick="document.getElementById('toHide').style.display='none'">Next step</a> +</div> +<p>Bug #74111: This test is to make sure that a scrolled element does not crash the browser when it goes hidden. The test passes if it does not crash.</p> +PASSED +</div> +  +</body> +</html> 
diff --git a/ManualTests/scrollbar-hittest.html b/ManualTests/scrollbar-hittest.html new file mode 100644 index 0000000..5ddef70 --- /dev/null +++ b/ManualTests/scrollbar-hittest.html 
@@ -0,0 +1,26 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=5829">http://bugs.webkit.org/show_bug.cgi?id=5829</a> REGRESSION: cursor tracking and hit testing in scrollable block don't take borders into account</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1. Scroll down by clicking in the empty space below the scroll thumb. <br> +2. Scroll up by clicking in the empty space above the scroll thumb.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Scroll thumb will move back up to the top. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Scroll thumb will NOT move back up to the top. +</p> + + <div style="overflow: auto; height:300px; width:50px; border-bottom: solid red 50px; border-top: solid green 20px;"> + <div style="height:400px;"></div> + </div> +  +</body> +</html> 
diff --git a/ManualTests/scrollbar-hittest2.html b/ManualTests/scrollbar-hittest2.html new file mode 100644 index 0000000..b44a762 --- /dev/null +++ b/ManualTests/scrollbar-hittest2.html 
@@ -0,0 +1,21 @@ +<html> +<head> +<title></title> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=6149">http://bugs.webkit.org/show_bug.cgi?id=6149</a> REGRESSION (WebCore-417.5): horizontal scrollbar in overflow with top border doesn't receive mouse events</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>TO TEST:</b> <br> +Scroll right by clicking in the empty space to the right of the scroll thumb.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Scroll thumb will move to the right. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Scroll thumb will NOT move at all. +<div id="target" style="width: 400px; overflow: auto; border-top: 20px solid grey; border-bottom: 10px solid blue;"> + <div style="width: 600px; height: 20px; background: green;"></div> +</div> +</body> +</html> 
diff --git a/ManualTests/scrollbar-hover-active.html b/ManualTests/scrollbar-hover-active.html new file mode 100644 index 0000000..e7646ca --- /dev/null +++ b/ManualTests/scrollbar-hover-active.html 
@@ -0,0 +1,76 @@ +<head> +<style> +div::-webkit-scrollbar { + width:17px; + height:17px; +} + +div::-webkit-scrollbar-button { + display: block; + width: 17px; + height: 17px; +} + +div::-webkit-scrollbar-button:-webkit-decrement:-webkit-start { + background-color:lightblue; + border:2px solid black; +} + +div::-webkit-scrollbar-button:-webkit-increment:-webkit-start { + background-color:lightgreen; + border:2px solid black; +} + +div::-webkit-scrollbar-button:-webkit-decrement:-webkit-end { + background-color:orange; + border:2px solid black; +} + +div::-webkit-scrollbar-button:-webkit-increment:-webkit-end { + background-color:brown; + border:2px solid black; +} + +div::-webkit-scrollbar-button:hover { + background-color:black !important; +} + +div::-webkit-scrollbar-thumb { + min-width:20px; + min-height:20px; + background-color: navy; + border:2px solid #cccccc; +} + +div::-webkit-scrollbar-track { + background-color: pink; +} + +div::-webkit-scrollbar-thumb:hover { + background-color: green; +} + +div::-webkit-scrollbar-thumb:active { + border:3px dotted white; +} + +div::-webkit-scrollbar-track:hover { + background-color: maroon; +} + +</style> +</head> +<body> +<div style="width:200px; height:200px; overflow-y:scroll; overflow-x:hidden"> +Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br> +<span style="white-space:nowrap">Hello world this is a long string and will not wrap.</span> +Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br>Hello<br> +Hello<br>Hello<br>Hello<br> +</div> 
diff --git a/ManualTests/scrollbars/scrollbars-in-composited-layers.html b/ManualTests/scrollbars/scrollbars-in-composited-layers.html new file mode 100644 index 0000000..5045236 --- /dev/null +++ b/ManualTests/scrollbars/scrollbars-in-composited-layers.html 
@@ -0,0 +1,45 @@ +<!DOCTYPE html> + +<html> +<head> + <style> + .scroll { + width: 200px; + height: 200px; + border: 1px solid black; + margin: 15px; + padding: 5px; + overflow-y: scroll; + transform: translateZ(0); + box-shadow: 0 0 15px black; + } + + .rotated { + transform: rotate3d(0, 0, 1, 45deg); + } + .scroll > div { + background-color: silver; + width: 500px; + height: 1000px; + } + </style> +</head> +<body> + + <p>Overlay scrollbars (on Mac) should show in the correct place when scrolling.</p> + <div class="scroll"> + <div></div> + </div> + + <p>Overlay scrollbars (on Mac) should show in the correct place when scrolling, and the resize corner should show in the correct place.</p> + <div class="scroll" style="resize: both; overflow:hiddens"> + <div></div> + </div> + + <p>Overlay scrollbars (on Mac) should show in the correct place when scrolling, and the resize corner should show in the correct place.</p> + <div class="rotated scroll" style="resize: both; overflow:hiddens"> + <div></div> + </div> + +</body> +</html> 
diff --git a/ManualTests/scrolling-coordinator-viewport-constrained-crash.html b/ManualTests/scrolling-coordinator-viewport-constrained-crash.html new file mode 100644 index 0000000..2e4128b --- /dev/null +++ b/ManualTests/scrolling-coordinator-viewport-constrained-crash.html 
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html> +<head> + <script> + function test() + { + if (window.testRunner) { + testRunner.dumpAsText(); + testRunner.waitUntilDone(); + } + window.location.href = "javascript:'>'"; + } + </script> +</head> +<body onload="test()"> + <!-- Tests https://bugs.webkit.org/show_bug.cgi?id=108695. Should not crash. --> + <div style="position: fixed"></div> + <div style="position: sticky"></div> +</body> +</html> 
diff --git a/ManualTests/scrolling-nestedframesets.html b/ManualTests/scrolling-nestedframesets.html new file mode 100644 index 0000000..d5f0509 --- /dev/null +++ b/ManualTests/scrolling-nestedframesets.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4361048">4361048</a> Glendale Regression: Seed: scrolling with scrollwheel, trackpad doesn't work for nested framesets at gmail.com</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ol> +	<li>Place your mouse cursor over the leftmost frame below.</li> +	<li>Try to scroll the contents of the frame up and down my using your mouse's scrollwheel.</li> +	<li>Repeat for the other two frames.</li> +</ol> + +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The contents of the frame each frame should scroll.</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The contents of each frame do NOT scroll. +</p> + +<iframe width="800" height="500" src="resources/nestedframesets.html"> + +</body> +</html> 
diff --git a/ManualTests/search-cancel-button.html b/ManualTests/search-cancel-button.html new file mode 100644 index 0000000..23c0c0b --- /dev/null +++ b/ManualTests/search-cancel-button.html 
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> +<body> + <p>https://bugs.webkit.org/show_bug.cgi?id=69886 - Clicking on the cancel button on readonly and disabled search fields darkens as if the search field was editable</p> + <p>Clicking on the disabled/readonly search inputs should not render the cancel button dark when you click on them.</p> + <p>Normal search:<br/><input type=search value="This is a string of long text." /></p> + <p>Disabled search:<br/><input type=search value="This is a string of long text." disabled /></p> + <p>Readonly search:<br/><input type=search value="This is a string of long text." readonly /></p> + <p>Disabled and readonly search:<br/><input type=search value="This is a string of long text." disabled readonly /></p> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/secure-keyboard-enabled-after-submit.html b/ManualTests/secure-keyboard-enabled-after-submit.html new file mode 100644 index 0000000..c0cd5f9 --- /dev/null +++ b/ManualTests/secure-keyboard-enabled-after-submit.html 
@@ -0,0 +1,34 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=13471">Bugzilla bug 13471</a> REGRESSION (r21045): Secure keyboard entry mode remains in effect after leaving a password field by submitting</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1) Use System Preferences > International > Input Menu to enable a non-Roman +input source, e.g. Arabic.<br> +2) Click in the password field below.<br> +3) Check that non-Roman input sources are disabled in the Input menu (the flag +on the right side of the menu bar).<br> +4) Press Return to submit the form.<br> +5) Click in the text field.<br> +6) Check that non-Roman input sources are enabled and selectable in the Input +menu. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Non-Roman input sources will be disabled in step 3 but will be enabled again in step 6. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Non-Roman input sources will be disabled in step 6. +</p> + +<form method="post" action="data:text/html,Can you enter non-Roman characters in this field now? %3cinput%3e"> + Focus this password field and press Return: <input type="password"> +</form> + +</body> +</html> 
diff --git a/ManualTests/select-delete-item.html b/ManualTests/select-delete-item.html new file mode 100644 index 0000000..c18df7f --- /dev/null +++ b/ManualTests/select-delete-item.html 
@@ -0,0 +1,21 @@ +<html> +<head> + <title>LayoutMenuList::itemStyle Select Element Crash</title> + <script> + function removeItem() { + var select = document.getElementById("dropDown"); + select.removeChild(document.getElementsByTagName("option")[2]); + } + </script> +</head> +<body> + <select id="dropDown" onfocus="setTimeout('removeItem();', 2000);"> + <option>Option 1</option> + <option>Option 2</option> + <option>Option 3</option> + </select> + <p>This is a test for bug <a href="http://webkit.org/b/34182">34182</a> Crash in WebKit!WebCore::LayoutMenuList::itemStyle. + Once the select gets focus, in 2 seconds it will delete an item. This test passes + if you have the select open when it deletes an item, and doesn't crash.</p> +</body> +</html> 
diff --git a/ManualTests/select-element-type-select.html b/ManualTests/select-element-type-select.html new file mode 100644 index 0000000..0a414f8 --- /dev/null +++ b/ManualTests/select-element-type-select.html 
@@ -0,0 +1,33 @@ +<html> +<head> +<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> + +	<title>select test</title> +</head> + +<body> +Typing c should select c for you here:<br/> +<select> +<option value="1">aaaaa</option> +<option value="2">bbbbb</option> +<option value="3">ccccc</option> +<option value="4">ddddd</option> +<option value="5">eeeee</option> +<option value="6">fffff</option> +<option value="7">ggggg</option> +</select> +<br/><br/> +And should here too:<br/> +<select multiple size="3"> +<option value="1">aaaaa</option> +<option value="2">bbbbb</option> +<option value="3">cccc</option> +<option value="4">ddddd</option> +<option value="5">ßcccc</option> +<option value="6">eeeee</option> +<option value="7">fffff</option> +<option value="8">zgggg</option> +</select> +</body> + +</html> 
diff --git a/ManualTests/select-menu-list-wrongly-positioned.html b/ManualTests/select-menu-list-wrongly-positioned.html new file mode 100644 index 0000000..c749b16 --- /dev/null +++ b/ManualTests/select-menu-list-wrongly-positioned.html 
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html> +<head> +<style> + table { + overflow: hidden; + } +</style> +<script> + function onSelectionChange(select) + { + document.getElementById('hiddenRow').style.display = ''; + } +</script> +</head> +<body> + <div><a href="https://bugs.webkit.org/show_bug.cgi?id=95776">95776</a>: REGRESSION(r120832): Layer::clampScrollOffset doesn't properly clamp</div> + <div>Manual test: click on the menu below and &lt;select&gt; the 'shown' option. Click somewhere on the page so that the &lt;select&gt; loses focus and click again on the &lt;select&gt;.</div> + <div>To pass the menu should be properly placed below the &lt;select&gt;.</div> + <form name="teste"> + <table> + <tr> + <th>Test select:</th> + <td> + <select onchange=onSelectionChange(this)> + <option value="0">hidden</option> + <option value="1">shown</option> + </select> + </td> + </tr> + <tr id="hiddenRow" style="display: none;"> + <th>Lorem ipsum</th> + <td>dolor sic amet.</td> + </tr> + </table> + </form> +</body> +</html> 
diff --git a/ManualTests/select-narrow-width.html b/ManualTests/select-narrow-width.html new file mode 100644 index 0000000..60d2711 --- /dev/null +++ b/ManualTests/select-narrow-width.html 
@@ -0,0 +1,48 @@ +<html> +<head> +Select narrow width manual test. +</head> + +<body> +See bug:<a href="https://bugs.webkit.org/show_bug.cgi?id=25904">25904</a>. +<p> +This test ensures that items in a select control can be selected. There +was a bug in Mac Chromium where select controls did not initialize their +widths properly, and while a click on the control would display the popup, +subsequent clicks on menu items were disregarded. +<p> +The bug was most easily reproduced with select controls containing many +(more than 20) items that had narrow widths. +<br> + +<select id="selectId"> + <option>a</option> + <option>b</option> + <option>c</option> + <option>d</option> + <option>e</option> + <option>f</option> + <option>g</option> + <option>h</option> + <option>i</option> + <option>j</option> + <option>k</option> + <option>l</option> + <option>m</option> + <option>n</option> + <option>o</option> + <option>p</option> + <option>q</option> + <option>r</option> + <option>s</option> + <option>t</option> + <option>u</option> + <option>v</option> + <option>w</option> + <option>x</option> + <option>y</option> + <option>z</option> +</select> + +</body> +</html> 
diff --git a/ManualTests/select-onchange-after-js.html b/ManualTests/select-onchange-after-js.html new file mode 100644 index 0000000..4cdea0a --- /dev/null +++ b/ManualTests/select-onchange-after-js.html 
@@ -0,0 +1,47 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<body> + <p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=11402">bug 11402</a> and  + <a href="http://bugs.webkit.org/show_bug.cgi?id=12701">bug 12701</a>: + An onChange event should fire when the first item is not the default, and + after changing the value via JavaScript.</p> + <p>After following the steps below, both selects should display "SUCCESS".</p> + + <form action="" method="post" name="areaform" id="areaform"> + <select name="selectitem" onChange="onChange1(this)"> + <option value="1">Please change this to another value</option> + <option value="2">(to this one)</option> + </select> + </form> + <form action="" method="post" name="areaform2" id="areaform2"> + <select name="selectitem2" onChange="onChange2(this)"> + <option value="1">(to this one)</option> + <option value="2" selected>Please change this to another value</option> + </select> + </form> + + <script> + function onChange1(sel) { + if (sel.secondTry) { + sel.options[1].text='SUCCESS'; + } else { + sel.options[0].text='Please change this to another value once again'; + sel.value = '1'; + sel.secondTry = 1; + } + } +  + function onChange2(sel) { + if (sel.secondTry) { + sel.options[0].text='SUCCESS'; + } else { + sel.options[1].text='Please change this to another value once again'; + document.forms.areaform2.selectitem2.options[1].selected = true; + sel.secondTry = 1; + } + } + </script> + +</body> +</html> 
diff --git a/ManualTests/select-option-in-onload.html b/ManualTests/select-option-in-onload.html new file mode 100644 index 0000000..3a4d8a6 --- /dev/null +++ b/ManualTests/select-option-in-onload.html 
@@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />  +<html>  + <head>  + <title>Programmatically selected popup item not shown</title> + <script type="text/javascript">  + function testMyPopup() { + var myPopup = document.getElementById('testPopup'); + for (var i = 0; i < myPopup.options.length; i++) { + if (myPopup.options[i].value == "2") + myPopup.options[i].selected = true; + } + } + </script>  + </head>  + <!--body--> + <body onload="testMyPopup();"> + <p>The popup below has the item "FAIL" selected by default in the html, but a javascript function + triggered from the body's onload changed it to "PASS" (assuming you saw an alert telling you so).</p>  + <p>Problem: In old versions of WebKit the change was not visible until you click on the popup.</p> + <form action="get"> + <select id="testPopup"> + <option value="0"></option> + <option value="1">One</option> + <option value="2">PASS</option> + <option value="3" selected="selected">FAIL</option> + </select> + </form> + </body> +</html> 
diff --git a/ManualTests/select-page-scroll.html b/ManualTests/select-page-scroll.html new file mode 100644 index 0000000..1dbd2a7 --- /dev/null +++ b/ManualTests/select-page-scroll.html 
@@ -0,0 +1,33 @@ +<p> +Click below the scroll thumb and H should scroll to the top. +See <a href="https://bugs.webkit.org/show_bug.cgi?id=53628">Bug 53628</a> for detail. + +<p> +<select multiple size=8> + <option>A</option> + <option>B</option> + <option>C</option> + <option>D</option> + <option>E</option> + <option>F</option> + <option>G</option> + <option>H</option> + <option>I</option> + <option>J</option> + <option>K</option> + <option>L</option> + <option>M</option> + <option>N</option> + <option>O</option> + <option>P</option> + <option>Q</option> + <option>R</option> + <option>S</option> + <option>T</option> + <option>U</option> + <option>V</option> + <option>W</option> + <option>X</option> + <option>Y</option> + <option>Z</option> +</select> 
diff --git a/ManualTests/select-popup-on-spacebar.html b/ManualTests/select-popup-on-spacebar.html new file mode 100644 index 0000000..7503eca --- /dev/null +++ b/ManualTests/select-popup-on-spacebar.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +</head> +<body onload="document.getElementById('selectId').focus()"> +<p><b>BUG ID:<a href="https://bugs.webkit.org/show_bug.cgi?id=18363">18363</a>.</p> +<p id="description"> +This test ensures that pressing spacebar on Mac, Gtk and Chromium ports or pressing +return in Gtk and Chromium ports will popup the select control when focused. +</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +Press <em>spacebar</em> or the <em>return</em> key (Gtk only). + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Select pops up the menu list</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Select does not popup a menu list - nothing happens.</p> + + +<select id="selectId"> + <option>Select</option> + <option>Item 1</option> +</select> + +</body> +</html> 
diff --git a/ManualTests/select-popup-tooltip-test.html b/ManualTests/select-popup-tooltip-test.html new file mode 100644 index 0000000..afba469 --- /dev/null +++ b/ManualTests/select-popup-tooltip-test.html 
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<body> +<h3> Test tool tip is correctly shown when popup select is displayed.</h3> +<ol> +<li>Click the following select tag.</li> +<li> Move mouse cursor on "option 1" and stop moving.</li> +<li> After seconds, make sure you can see tool tip text "This is the first option".</li> +<li> Move mouse cursor on "option 2" and stop moving.</li> +<li> Make sure you can see tool tip text "This is the second option".</li> +</ol> + +<select size=1> +<option title="This is the first option">option 1</option> +<option title="This is the second option">option 2</option> +<option title="This is the third option">option 3</option> +</select> +</body> +</html> 
diff --git a/ManualTests/select-scroll.html b/ManualTests/select-scroll.html new file mode 100644 index 0000000..95b8a5a --- /dev/null +++ b/ManualTests/select-scroll.html 
@@ -0,0 +1,34 @@ +<p> +When you click the following &lt;select&gt;, you should see a scrollbar, +and should be able to scroll down to see "Z" as the last option. +See <a href="https://bugs.webkit.org/show_bug.cgi?id=49306">Bug 49306</a> for detail. + +<p> +<select> + <option>A</option> + <option>B</option> + <option>C</option> + <option>D</option> + <option>E</option> + <option>F</option> + <option>G</option> + <option>H</option> + <option>I</option> + <option>J</option> + <option>K</option> + <option>L</option> + <option>M</option> + <option>N</option> + <option>O</option> + <option>P</option> + <option>Q</option> + <option>R</option> + <option>S</option> + <option>T</option> + <option>U</option> + <option>V</option> + <option>W</option> + <option>X</option> + <option>Y</option> + <option>Z</option> +</select> 
diff --git a/ManualTests/select-webkit-appearance-off-narrow-select.html b/ManualTests/select-webkit-appearance-off-narrow-select.html new file mode 100644 index 0000000..34e4681 --- /dev/null +++ b/ManualTests/select-webkit-appearance-off-narrow-select.html 
@@ -0,0 +1,49 @@ +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> + <title>Padding on select with webkit-appearance: off</title> + <style type="text/css"> + #webkit-appearance-none { + -webkit-appearance: none; + border: 1px solid black; + width: 15px; + padding-left: 5px; + padding-right: 5px; + } +  + #narrow-with-border { + border: 1px solid black; + width: 40px; + } + </style> +</head> + +<body> + <p>This is a manual test for <a href="https://bugs.webkit.org/show_bug.cgi?id=33235">Padding in popup  + menu gets lost with styled select in Windows</a></p> + <p>To open the selects, click inside the select boxes below.</p> + + <p>The options in this selects should have padding on both the left and the right, the edges of + the text should not be pressed against the edges of the opened select.</p> + <select id="webkit-appearance-none"> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <hr /> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + </select> +  + <p>The options in this select should not have too much padding on the right</p> + <select id="narrow-with-border"> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + <hr /> + <option href="#">Do Action ABCDEFG</option> + <option href="#">Do Action ABCDEFG</option> + </select> +</body> +</html> 
diff --git a/ManualTests/select_alignment.html b/ManualTests/select_alignment.html new file mode 100644 index 0000000..7c1bc0e --- /dev/null +++ b/ManualTests/select_alignment.html 
@@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" > +<head> +<title>Test drop-down item's alignment in <select>/<option></title> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +</head> +<body> +<p> +select drop-down items' alignment should be determined by the directionality of +&lt;select&gt; tag. +<p> +The drop-down items in the following &lt;select&gt; should be left-aligned. +<br> +<select> +<option>abc def</option> +<option>שנב גקכ</option> +<option dir="rtl">abc שנב def</option> +<option dir="ltr">שנב abc גקכ</option> +<option dir="rtl">hi!</option> +<option dir="ltr">hi!</option> +</select> +<br> +The drop-down items in the second &lt;select&gt; should be right-aligned. +<p> +<select dir="rtl"> +<option>abc def</option> +<option>שנב גקכ</option> +<option dir="rtl">abc שנב def</option> +<option dir="ltr">שנב abc גקכ</option> +<option dir="rtl">hi!</option> +<option dir="ltr">hi!</option> +</select> +</body> +</html> 
diff --git a/ManualTests/select_dropdown_box_alignment.html b/ManualTests/select_dropdown_box_alignment.html new file mode 100644 index 0000000..07035b7 --- /dev/null +++ b/ManualTests/select_dropdown_box_alignment.html 
@@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" > +<head> +<title>Test <select> drop-down box's alignment</title> +<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8"> +</head> +<body> +<p> +For RTL, select drop-down box's should be right aligned with the &lt;select&gt; +element and expands to left instead of right. +<p> +The drop-down box in the following &lt;select&gt; should be left-aligned and expand to right. +<br> +<select style="width:100px"> +<option>Arabic</option> +<option>Hebrew</option> +<option>English (United States)</option> +<option>Chinese (Simplified Chiense)</option> +</select> +<br> +The drop-down box in the second &lt;select&gt; should be right-aligned and expand to left. +<p> +<select dir="rtl" style="width:100px"> +<option>Arabic</option> +<option>Hebrew</option> +<option>English (United States)</option> +<option>Chinese (Simplified Chiense)</option> +</select> +</body> +</html> 
diff --git a/ManualTests/select_hr.html b/ManualTests/select_hr.html new file mode 100644 index 0000000..957a995 --- /dev/null +++ b/ManualTests/select_hr.html 
@@ -0,0 +1,234 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script> + function getSelectInfo(myselect, mydiv) { + var s = document.getElementById(myselect); + var selectLength = s.length; + var optionCollectionLength = s.options.length; + var selectedInd = s.selectedIndex; + var opt = s.options[selectedInd]; + var optText = ""; +  + if (opt) { + optText = opt.innerHTML; + } +  + document.getElementById(mydiv).innerHTML = "Select length: " + selectLength + "<br>Option collection length: " + optionCollectionLength + "<br>Selected index: " + selectedInd + "<br>Selected option: " + optText; + } +  + function getAllInfo(x) { + for (i = 1; i < x; i++) { + var s = "s" + i; + var d = "d" + i; +  + getSelectInfo(s, d); + } + } +</script> + + +</head> +<body onload="getAllInfo(12)"> +<p><b>BUG ID:</b> <a href="rdar://problem/4229189">4229189</a> add a way to get a separator into a select element</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Please describe the steps required to test this bug here. +</p> + + +These tests make sure that adding an hr element in a select works properly. + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>This should be a disabled popup menu, since the hr is not selectable.  +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b> </p> +<select id = "s1"> +<hr> +</select> +<div id="d1"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: separator, option, separator +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s2"> +<hr> +<option>opt 1</option> +<hr> +</select> +<div id="d2"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: option, separator, option +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s3"> +<option>opt 1</option> +<hr> +<option>opt 2</option> +</select> +<div id="d3"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: option, four separators, two options, separator, option. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s4"> +<option>opt 1</option> +<hr> +<hr> +<hr> +<hr> +<option>opt 2</option> +<option>opt 3</option> +<hr> +<option>opt 4</option> +</select> +<div id="d4"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: group label, option, separator (incl. in group). +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s5"> +<optgroup label="Group 1"> +<option>opt 1</option> +<hr> +</optgroup> +</select> +<div id="d5"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: separator, group label, option. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s6"> +<hr> +<optgroup label="Group 1"> +<option>opt 1</option> +</optgroup> +</select> +<div id="d6"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: group label, option, separator, option, separator, option, two separators, (end of group), one option. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s7"> +<optgroup label="Group 1"> +<option>opt 1</option> +<hr> +<option>opt 2</option> +<hr> +<option>opt 3</option> +<hr> +<hr> +</optgroup> +<option>opt 4</option> +</select> +<div id="d7"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a popup menu with the following items: group label, one option two separators, (end of group), separator, group label, separator, two options, separator, (end of group), option. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s8"> +<optgroup label="Group 1"> +<option>opt 1</option> +<hr> +<hr> +</optgroup> +<hr> +<optgroup label="Group 2"> +<hr> +<option>opt 2</option> +<option>opt 3</option> +<hr> +</optgroup> +<option>opt 4</option> +</select> +<div id="d8"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +A disabled popup menu - since the optgroup and the hr are not selectable. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +</p> +<select id = "s9"> +<optgroup label="Group 1"> +<hr> +</optgroup> +</select> +<div id="d9"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a list box with the following items: 4 options. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +You should not see any separators in the list box.</p> +<br><select id = "s10" multiple> +<option value="test">opt 1</option> +<hr> +<hr> +<hr> +<hr> +<option>opt 2</option> +<option>opt 3</option> +<hr> +<option>opt 4</option> +</select> +<div id="d10"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see a list box with the following items: one option, group label, 3 options. +</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +You should not see any separators in the list box.</p> +<select id = "s11" multiple> +<option value="test">opt 1</option> +<hr> +<hr> +<optgroup label="Group 1"> +<hr> +<hr> +<option>opt 2</option> +<option>opt 3</option> +<hr> +<option>opt 4</option> +</optgroup> +</select> +<div id="d11"></div> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +For each of these list boxes, when you change the selection in JavaScript to index 1, the second option should get highlighted</p> +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +"opt 2" does not get highlighted after clicking the button.</p> + +<select id="s12" multiple> +<option id="o3">opt 1</option> +<hr> +<option id="o4">opt 2</option> +</select> +<input type="button" value="Change selection to 'opt 2'" onclick="document.getElementById('s12').selectedIndex = 1;"></input> + +<br><select id="s13" multiple> +<option id="o5">opt 1</option> +<hr> +<optgroup label="group"> +<option id="o6">opt 2</option> +</optgroup> +</select> +<input type="button" value="Change selection to 'opt 2'" onclick="document.getElementById('s13').selectedIndex = 1;"></input> + +<body> +</html> + 
diff --git a/ManualTests/select_webkit_appearance_off_popup_alignment.html b/ManualTests/select_webkit_appearance_off_popup_alignment.html new file mode 100644 index 0000000..3e48852 --- /dev/null +++ b/ManualTests/select_webkit_appearance_off_popup_alignment.html 
@@ -0,0 +1,78 @@ +<html> + +<body> + <p>Manual test for popup alignment of select with no apperance.</p> + + <p>All popup boxes should all align with select element on both left and right side.</p> + + No scrollbar in popup:<br> +  + LTR: <select size="1" style="-webkit-appearance: none;"> + <option>Item 1</option> + <option>Item 2</option> + <option>Item 3</option> + <option>Item 4</option> + <option>Item 5</option> + </select> + + RTL: <select size="1" dir="rtl" style="-webkit-appearance: none;"> + <option>Item 1</option> + <option>Item 2</option> + <option>Item 3</option> + <option>Item 4</option> + <option>Item 5</option> + </select> + + <br> + + Popup has scrollbar:<br> + LTR: <select size="1" style="-webkit-appearance: none; padding-right: 20px;"> + <option>Item 1</option> + <option>Item 2</option> + <option>Item 3</option> + <option>Item 4</option> + <option>Item 5</option> + <option>Item 6</option> + <option>Item 7</option> + <option>Item 8</option> + <option>Item 9</option> + <option>Item 10</option> + <option>Item 11</option> + <option>Item 12</option> + <option>Item 13</option> + <option>Item 14</option> + <option>Item 15</option> + <option>Item 16</option> + <option>Item 17</option> + <option>Item 18</option> + <option>Item 19</option> + <option>Item 20</option> + <option>Item 21</option> + </select> + + RTL: <select size="1" dir="rtL" style="-webkit-appearance: none; padding-left: 20px;"> + <option>Item 1</option> + <option>Item 2</option> + <option>Item 3</option> + <option>Item 4</option> + <option>Item 5</option> + <option>Item 6</option> + <option>Item 7</option> + <option>Item 8</option> + <option>Item 9</option> + <option>Item 10</option> + <option>Item 11</option> + <option>Item 12</option> + <option>Item 13</option> + <option>Item 14</option> + <option>Item 15</option> + <option>Item 16</option> + <option>Item 17</option> + <option>Item 18</option> + <option>Item 19</option> + <option>Item 20</option> + <option>Item 21</option> + </select> + +</body> +</html> 
diff --git a/ManualTests/selection-drag-crash.html b/ManualTests/selection-drag-crash.html new file mode 100644 index 0000000..42fd740 --- /dev/null +++ b/ManualTests/selection-drag-crash.html 
@@ -0,0 +1,14 @@ +<html> +<head> +<script> +function selectText() { + window.getSelection().selectAllChildren(document.body); +} +</script> +</head> +<body onload="selectText()"> +<p> +Drag the selected text. It shouldn't crash, though it used to on Chromium Mac since createDragImageForSelection() didn't properly use the return value from dissolveDragImageToFraction(), which resulted in a race condition for the drag image's refcount. This issue can't be tested in an automated manner, due to the fact that the race condition is hard to trigger deterministically and that test_shell/DRT simply don't use the (potentially invalid) image parameter. +</p> +</body> +</html> 
diff --git a/ManualTests/selection-start-after-inserting-line-break-in-textarea.html b/ManualTests/selection-start-after-inserting-line-break-in-textarea.html new file mode 100644 index 0000000..0203199 --- /dev/null +++ b/ManualTests/selection-start-after-inserting-line-break-in-textarea.html 
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> +<body> +<p>This tests selectionStart is updated properly when inserting LF into textarea. To test, press Enter several times inside textarea and click the log button. This bug does not reproduce when new lines are added by execCommand or eventSender.</p> +<textarea cols="20" rows="20"></textarea> +<button id="button" onclick="verify()">verify</button> +<div id="console"></div> +<script> + +function verify() { + var console = document.getElementById('console'); + if (textarea.value.match(/[^\n]/)) + console.innerHTML = 'textarea contains unexpected character. You can only type LF in this test.'; + else if (textarea.selectionStart != textarea.value.length) + console.innerHTML = 'FAIL: expected ' + textarea.value.length + ' but got ' + textarea.selectionStart; + else + console.innerHTML = 'PASS: ' + textarea.value.length + ' LFs'; +} + +var textarea = document.getElementsByTagName('textarea')[0]; +textarea.focus(); + +</script> +</body> +</html> 
diff --git a/ManualTests/shift-alt-key-event.html b/ManualTests/shift-alt-key-event.html new file mode 100644 index 0000000..3dafa47 --- /dev/null +++ b/ManualTests/shift-alt-key-event.html 
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html> +<head> +<script> +window.onload = function() { + document.getElementById("myinput").focus(); +}; + +function keyDown(event) +{ + var output = document.getElementById("console"); + var text = "shiftKey = "+event.shiftKey+ ", altKey = "+event.altKey+ ", which = "+ event.which; + + if (event.shiftKey == true && event.altKey == true && event.which == 18) { + text = text + "<br>TEST : <b>PASSED</b>" + } else { + text = text + "<br>TEST : <b>FAILED</b>" + } + output.innerHTML = text; +} + +</script> +</head> +<body> +<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=111112">bug 111112</a>: +Shift + Alt key press</p> + +<p>Try press Shift then alt key. +The test passes if the shiftKey, altKey values of JsKeyEvent are true and keycode/which is 18.<p> + +<input type="text" id="myinput" onkeydown="keyDown(event)"> +<br><br> +<div id="console"></div> +</body> +</html> 
diff --git a/ManualTests/show-hide-object.html b/ManualTests/show-hide-object.html new file mode 100644 index 0000000..88bfbc8 --- /dev/null +++ b/ManualTests/show-hide-object.html 
@@ -0,0 +1,64 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/3572507">3572507</a> Flash in div with display:none style will not redraw when style changed to display:block (3479)</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1. Verify that there is a Flash animation playing below.<br> +2. Click "Hide Flash".<br> +3. Click "Show Flash".<br> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The Flash movie hides when "Hide Flash" is clicked, and shows again when "Show Flash" is clicked. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The Flash movie hides when "Hide Flash" is clicked, but does not show again when "Show Flash" is clicked. Clicking on "Hide Flash" and then "Show Flash" again will show the movie. +</p> + +<script language="JavaScript"> + +	// 2 html tabs for multiple flash/java +	var selected = "tab1"; + +	function tabClick(whichTab) { + selected = whichTab; + + if (whichTab == "tab1") { + document.getElementById('tab1').style.display = "block"; + document.getElementById('tab2').style.display = "none"; + } + else if (whichTab == "tab2") { + document.getElementById('tab2').style.display = "block"; + document.getElementById('tab1').style.display = "none"; + } +	} +</script> + +<div> + +	<input type=button value="Hide Flash" onClick="tabClick('tab2')"><input type=button value="Show Flash" onClick="tabClick('tab1')"> + + +	<div id="tab2" style="display: none"> +	Flash hidden. +	</div> + +	<div id="tab1"> +	<object id="scopeFlash" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="300" height="200" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"> + <param name="movie" value="resources/spinbox.swf"> + <param name="quality" value="high"> + <comment> +	<embed src="resources/spinbox.swf" width="300" height="200" quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">  +	</embed> + </comment> +	</object> +	</div> +</div> + +</body> +</html> 
diff --git a/ManualTests/simple-image-compositing.html b/ManualTests/simple-image-compositing.html new file mode 100644 index 0000000..19fa29d --- /dev/null +++ b/ManualTests/simple-image-compositing.html 
@@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Checking for simple image layer optimisation</title> + <style type="text/css" media="screen"> + img { + float: left; + width: 150px; + height: 150px; + } + p { + clear: both; + margin: 1em 2em; + height: 180px; + } + img { + transform: rotate3d(0, 0, 1, 0); + } + </style> +</head> +<body> + + <h1>Image optimisation in layers</h1> + + <p style="height: auto"> + In order to run this test you should enable the debugging options that indicate + what type of compositing layer is being used. + </p> +  +<pre> +defaults write com.apple.Safari WebCoreLayerRepaintCounter -bool yes +defaults write com.apple.Safari WebCoreLayerBorders -bool yes +</pre> +  + <p style="height: auto"> + Directly composited image layers will have a yellow border and no repaint counter. + </p> + + <p> + <img src="resources/simple_image.png"> + Basic image - no style - can be directly composited + </p> + + <p> + <img src="resources/simple_image.png" style="border: 5px solid blue;"> + 5px blue border - can NOT be directly composited + </p> + + <p> + <img src="resources/simple_image.png" style="margin: 10px 20px;"> + margin - can NOT be directly composited + </p> + + <p> + <img src="resources/simple_image.png" style="background-color: grey;"> + solid background - can be directly composited + </p> + + <p> + <img src="resources/simple_image.png" style="background: orange url(resources/simple_image.png) -50px -50px;"> + background image - can NOT be directly composited + </p> + + <p> + <img src="resources/simple_image.png" style="transform: rotate3d(0, 0, 1, 10deg);"> + rotated but otherwise no style - can be directly composited + </p> + + + + +</body> +</html> 
diff --git a/ManualTests/slider-thumb-tracking.html b/ManualTests/slider-thumb-tracking.html new file mode 100644 index 0000000..5a852c8 --- /dev/null +++ b/ManualTests/slider-thumb-tracking.html 
@@ -0,0 +1,28 @@ +<html> +<head> + <title></title> + <script type="text/javascript"> + function test() + { + var slider = document.getElementById("slider"); + var x = slider.offsetWidth * 3 / 4; + var y = slider.offsetHeight / 2; +  + var event = document.createEvent("MouseEvent"); + event.initMouseEvent("mousedown", true, true, document.defaultView, 1, 0, 0, x, y, false, false, false, false, 0, document); + slider.dispatchEvent(event); + } + </script> +</head> +<body onload="test()"> + <p> + Test for <i><a href="http://bugs.webkit.org/show_bug.cgi?id=11621">http://bugs.webkit.org/show_bug.cgi?id=11621</a> + REGRESSION (Native slider): slider thumb not updated when the mouse is dragged/released out of range</i>. + </p> + <p> + The slider thumbs should be at the same horizontal position. + </p> + <input type="range" id="slider" value="30"> + <br> + <input type="range" value="70"> +</body> 
diff --git a/ManualTests/spatial-navigation/frameset.html b/ManualTests/spatial-navigation/frameset.html new file mode 100644 index 0000000..fe82e4a --- /dev/null +++ b/ManualTests/spatial-navigation/frameset.html 
@@ -0,0 +1,7 @@ +<html> + <frameset border=1 rows="10%,10%,*"> + <frame src="links.html"/> + <frame src="links.html"/> + <frame src="spatial-navigation-test-cases.html"/> + </frameset><br><br> +</html> 
diff --git a/ManualTests/spatial-navigation/links.html b/ManualTests/spatial-navigation/links.html new file mode 100644 index 0000000..18cfd62 --- /dev/null +++ b/ManualTests/spatial-navigation/links.html 
@@ -0,0 +1,8 @@ +<html> + <body> + <p> + <a href="a">x</a> + <a href="a">y</a> + <a href="a">z</a> + </body> +</html> 
diff --git a/ManualTests/spatial-navigation/spatial-navigation-test-cases.html b/ManualTests/spatial-navigation/spatial-navigation-test-cases.html new file mode 100644 index 0000000..c3f25e4 --- /dev/null +++ b/ManualTests/spatial-navigation/spatial-navigation-test-cases.html 
@@ -0,0 +1,167 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> + <head> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <title>Spatial Navigation Test Cases</title> + </head> + <body> + + <div style="margin-left: 40px; text-align: center;"> + <h1 style="text-align: left;">Spatial Navigation Fun</h1> + <h2 style="text-align: left;">3x3 Centered Table Test</h2> + </div> + + <table style="text-align: left; width: 100%; margin-left: auto; margin-right: auto;" border="1" cellpadding="2" cellspacing="2"> + <tbody> + <tr> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + </tr> + <tr> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + </tr> + <tr> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + <td style="vertical-align: top; text-align: center;"><a href="a">test</a></td> + </tr> + </tbody> + </table> + + <div style="margin-left: 40px; text-align: left;"><br> + + <div style="text-align: left;"> + <h2>Vertical Sine Test</h2><br> + </div> + + <div style="text-align: left;"> + <a href="a">test<br></a> + </div> + + <div style="margin-left: 40px;"> + <a href="a">test<br></a> + </div> + + <div style="margin-left: 80px;"> + <a href="a">test<br></a> + </div> + + <div style="margin-left: 40px;"> + <a href="a">test<br></a> + </div> + + <a href="a">test<br></a> + + <div style="margin-left: 40px;"> + <a href="a">test<br></a> + </div> + + <div style="margin-left: 80px;"> + <a href="a">test<br></a> + </div> + + <div style="margin-left: 40px;"> + <a href="a">test<br></a> + </div> + + <a href="a">test<br></a>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + <a href="a">test<br></a> + + <h2>Increasing sentence length</h2> + <a href="a">H</a><br> + <a href="p">Ho<br></a> + <a href="p">How<br></a> + <a href="p">How <br></a> + <a href="p">How N</a><br> + <a href="p">How No</a><br> + <a href="p">How Now</a><br> + <a href="p">How Now </a><br> + <a href="p">How Now B</a><br> + <a href="p">How Now Br</a><br> + <a href="p">How Now Bro</a><br> + <a href="p">How Now Brow</a><br> + <a href="p">How Now Brown</a><br> + <a href="p">How Now Brown </a><br> + <a href="p">How Now Brown C</a><br> + <a href="p">How Now Brown Co</a><br> + <a href="p">How Now Brown Cow</a><br> + <br> + + <h2>Split sentence<br></h2><br> + <a href="p">H</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a href="p">ow Now Brown Cow</a><br> + <a href="p">Ho</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <a href="p">w Now Brown Cow</a><br> + <a href="p">How</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="p">Now Brown Cow</a><br> + <a href="p">How N</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; <a href="p">ow Brown Cow</a><br> + <a href="p">How No</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">w Brown Cow</a><br> + <a href="p">How Now </a>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">Brown Cow</a><br> + <a href="p">How Now B</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">rown Cow</a><br> + <a href="p">How Now Br</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">own Cow</a><br> + <a href="p">How Now Bro</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">wn Cow</a><br> + <a href="p">How Now Brow</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="p">n Cow</a><br> + <a href="p">How Now Brown</a> &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; <a href="p">Cow</a><br> + <a href="p">How Now Brown C</a> &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">ow</a><br> + <a href="p">How Now Brown Co</a> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; <a href="p">w</a><br> + <a href="p">How Now Brown Cow</a><br><br> + + <h2>Line Wrap Test</h2><br> + + <table style="text-align: left; width: 393px; height: 72px;" border="1" cellpadding="2" cellspacing="2"> + <tbody> + <tr> + <td style="vertical-align: top;"> + <span class="huge"> + <a href="a">Which of the following constanst do you like the most, one is g, one is pi, and the other is e. </a><br> + </span> + </td> + + <td style="vertical-align: top;"> + <a href="a">3.14</a><br> + <a href="a">2.71</a><br> + <a href="a">6.67</a><br> + </td> + </tr> + </tbody> + </table><br> + + <h2>Javascript Focus/Blur Test</h2> + When going to any link from the following link, you should see a dialog.<br><br> + <a href="a" onblur='alert("onBlurt")'>Test</a><br><br> + + <h2>IFrames</h2><br> + <iframe src="links.html"></iframe><br><br><br> + + <h2>DIVs</h2><br> + <div id=v> + <a href="a">a</a> + <div id="Div1"> + <a href="a">b</a> + </div> + <a href="a">c</a> + </div><br><br> + + <h3> Form elements </h3> + + <i> Make sure you can enter space in boxes below </i> <br> + + <input type="text" /> <br><br> + <textarea></textarea> + + <h3> Content editable </h3> + + <i> Make sure you can edit the text below and enter spaces. </i> <br><br> + + <div contentEditable="true"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec nisi et lectus vulputate fermentum eget a eros. Mauris blandit, enim ac varius ultricies, tortor orci semper sem, in faucibus eros dolor nec turpis. Vestibulum tincidunt pellentesque lacus, ut tincidunt ipsum pretium laoreet. Nulla sed mi magna. Aliquam vitae quam viverra, sodales augue pretium, pharetra odio. Nunc iaculis nisi augue, quis ullamcorper lorem congue ut. Proin id ligula ipsum. + +Nulla auctor porta sapien, vitae elementum libero rhoncus ac. Sed pretium vel neque a interdum. Duis id tristique lacus. Nulla vel lobortis libero. Morbi nisi quam, aliquet vel leo id, hendrerit imperdiet sem. Mauris interdum, odio non interdum tempus, turpis tellus ornare ipsum, quis cursus risus tellus quis nisl. Suspendisse dictum elit ut lectus auctor tincidunt. Aenean at egestas mi. Morbi porttitor dictum ipsum blandit tincidunt. Sed eu justo libero. Proin interdum tempor gravida. + </div> + + <br><br> + + <a href="last">last</a> + </div> +</body> +</html> 
diff --git a/ManualTests/stale-currentEvent.html b/ManualTests/stale-currentEvent.html new file mode 100644 index 0000000..e9dfcfc --- /dev/null +++ b/ManualTests/stale-currentEvent.html 
@@ -0,0 +1,57 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> + <script type="text/javascript"> + var inner_win; + + function open_inner() + { + var src = 'data:text/html,<title>Pop up</title><input type="button" value="Close" onclick="opener.closeChild()">'; + var tp = document.getElementById("theparent"); + inner_win = window.open(src, 'inner', 'width=200, height=200, left=' + (screenLeft + tp.offsetLeft) + ', top=' + (screenTop + outerHeight - innerHeight + tp.offsetTop)); + } + + function removeHoverNode() + { + var tp = document.getElementById("theparent"); + tp.parentNode.removeChild(tp); + setTimeout(reportSuccess, 500); + } + + function reportSuccess() + { + document.body.appendChild(document.createTextNode("SUCCESS")); + } + + function closeChild() + { + inner_win.close(); + document.body.offsetTop; + setTimeout(removeHoverNode, 100); + } + </script> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/5095977">5095997</a> (<a href="http://bugs.webkit.org/show_bug.cgi?id=13218">13218</a>) Reproducible crash after call to window.close()</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b><br> + 1. Click the Open button below. A pop up window will open.<br> + 2. In the pop up window, click the Close button, being careful not to + move the mouse during and shortly after clicking. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  + The black square will be replaced by the word &ldquo;SUCCESS&rdquo; and Safari will not crash. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  + Safari will crash (the word &ldquo;SUCCESS&rdquo; may appear before the crash). +</p> + <div id='theparent'> + <input type="button" value="Open" onclick="open_inner()"> + <div style="background: black; width: 200px; height:200px"> + </div> + </div> +</body> +</html> 
diff --git a/ManualTests/stale-scrollbar-client-crash.html b/ManualTests/stale-scrollbar-client-crash.html new file mode 100644 index 0000000..037b21c --- /dev/null +++ b/ManualTests/stale-scrollbar-client-crash.html 
@@ -0,0 +1,54 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/5523503">rdar://problem/5523503</a> Safari crashes clicking scroll bar in FaceBook 'Trips'</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Drag the scroll thumb in each of the vertical scrollbars below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Each scrollbar will disappear when clicked, along with the box containing it, but the browser will not crash as you continue to drag. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The scrollbar will disappear and Safari will crash as you continue dragging. +</p> + +<div style="height: 120px;"> + <div id="overflow" style="overflow: auto; height: 100px; width: 100px; background-color: lightblue;"> + <div style="height: 200px;"></div> + </div> +</div> +<div> + <select multiple="true" id="listbox" style="height: 100px; width: 100px;"> + <option>One</option> + <option>Two</option> + <option>Three</option> + <option>Four</option> + <option>Five</option> + <option>Six</option> + <option>Seven</option> + <option>Eight</option> + <option>Nine</option> + <option>Ten</option> + </select> +</div> +<script> + var overflow = document.getElementById("overflow"); + var listbox = document.getElementById("listbox"); + + function mousedown(event) + { + if (event.target.id) + setTimeout(event.target.id + '.style.display = "none"', 0); + } + + overflow.addEventListener("mousedown", mousedown, false); + listbox.addEventListener("mousedown", mousedown, false); +</script> +</body> +</html> 
diff --git a/ManualTests/style-keypress-events.html b/ManualTests/style-keypress-events.html new file mode 100644 index 0000000..b0d2770 --- /dev/null +++ b/ManualTests/style-keypress-events.html 
@@ -0,0 +1,38 @@ +<body onload="setup()"> +<p>cmd+b and cmd+i should generate a keydown event in contentEditable fields. Also, calling +preventDefault() in the keydown event should cancel the text styling.</p> + +<div contentEditable id="test" style="border: 1px solid; padding: 4px;"> +This is some sample text.<br><br><br><br> +</div> +<div> +<input type="checkbox" id="disable"><label for="disable">preventDefault() in keydown</label> +</div> +<div id="log"></div> + +<script> +function setup() +{ + var test = document.getElementById("test"); + test.addEventListener("keydown", keydown, false); + + var selection = window.getSelection(); + selection.setPosition(test, 0); + selection.modify("extend", "forward", "sentence"); + test.focus(); +} + +function log(msg) +{ + var log = document.getElementById("log"); + log.innerHTML += "<br>" + msg; +} + +function keydown(event) +{ + log("keydown"); + if (document.getElementById("disable").checked) + event.preventDefault(); +} +</script> +</body> 
diff --git a/ManualTests/submit-form-with-target-twice.html b/ManualTests/submit-form-with-target-twice.html new file mode 100644 index 0000000..9b10410 --- /dev/null +++ b/ManualTests/submit-form-with-target-twice.html 
@@ -0,0 +1,15 @@ +<html> +<script> +function runTest() { + var form = document.getElementById('f'); +  + form.submit(); + form.submit(); +} +</script> +<form id="f" target="foo"><input></form> +<p>This tests that calling form.submit() twice in a row from JavaScript, on a form with a custom target and with at least one text field does not cause an assertion in a debug build of Safari. +</p> +<p>To test this, click the button below. A new window should open up and Safari should not assert.</p> +<button onclick="runTest()">Click Here</button> +</html> 
diff --git a/ManualTests/subview-click-assertion.html b/ManualTests/subview-click-assertion.html new file mode 100644 index 0000000..121ee2f --- /dev/null +++ b/ManualTests/subview-click-assertion.html 
@@ -0,0 +1,32 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=9984">Bugzilla bug 9984</a> ASSERTION FAILURE: _private->mouseDownEvent != nil (WebKit/WebView/WebHTMLView.m:4863 -[WebHTMLView(WebInternal) _delegateDragSourceActionMask])</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Open this test in a new Safari window. In the new window, click once on the text &ldquo;Click me&rdquo;. Do not click +anywhere else in the window before clicking the text. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The text will be deselected. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +An assertion failure will occur. +</p> + +<iframe id="frame"></iframe> +<script> + var win = window['frame']; + var doc = win.document; + doc.write("<p id='target'>Click me</p>"); + var target = doc.getElementById('target'); + win.getSelection().setBaseAndExtent(target, 0, target, 1); +</script> + +</body> +</html> 
diff --git a/ManualTests/svg-animateTransform-calcMode-discrete.svg b/ManualTests/svg-animateTransform-calcMode-discrete.svg new file mode 100644 index 0000000..f9abef8 --- /dev/null +++ b/ManualTests/svg-animateTransform-calcMode-discrete.svg 
@@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<text x="10" y="20">Testing calcMode="discrete" for &lt;animateTransform&gt;. The rect should jump by 100px at 2s.</text> +<rect y="30" width="100px" height="100px" fill="green"> + <animateTransform attributeName="transform" type="translate" from="0,0" to="100,0" calcMode="discrete" fill="freeze" dur="4s"/> +</rect> +</svg> 
diff --git a/ManualTests/svg-animated-gifs.svg b/ManualTests/svg-animated-gifs.svg new file mode 100644 index 0000000..c661d41 --- /dev/null +++ b/ManualTests/svg-animated-gifs.svg 
@@ -0,0 +1,17 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> +  + <text x="0" y="15">There should be only one animated image here, rotated, and not clipped:</text> + <g transform="rotate(45,100,250)" > + <rect fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + <foreignObject x="70" y="70" width="150" height="150" > + <xhtml:img src="resources/3dolph.gif" width="150" height="150" /> + </foreignObject> + </g> + <text x="0" y="400">The animated image below should look like the one above:</text> + <g transform="translate(0, 400) rotate(45,100,250)" > + <rect fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + <image xlink:href="resources/3dolph.gif" x="60" y="60" width="170" height="170" /> + </g> +</svg> 
diff --git a/ManualTests/svg-animation-css-transform.html b/ManualTests/svg-animation-css-transform.html new file mode 100644 index 0000000..e046840 --- /dev/null +++ b/ManualTests/svg-animation-css-transform.html 
@@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>SVG Animation of elements transformed using -webkit-transform</title> +</head> +<body> + <h1>SVG Animation of SVG element rotated using '-webkit-transform'</h1> + + <p>The rotated rect should from 0,0 to 100,0 over 3 seconds.</p> + + <svg xmlns='http://www.w3.org/2000/svg'> + <rect id="target" width='100' height='100' stroke="blue" fill="none" style="transform: rotate(45deg)"> + <animateMotion to='100,0' dur='3s' /> + </rect> + </svg> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/svg-animation-parseValues.svg b/ManualTests/svg-animation-parseValues.svg new file mode 100644 index 0000000..391916c --- /dev/null +++ b/ManualTests/svg-animation-parseValues.svg 
@@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd"> + +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="tiny" id="svg-root" width="100%" height="100%" viewBox="0 0 480 360"> + <text text-anchor="middle" x="240" y="15" font-size="16">Test for WebKit bug 12565</text> + <text text-anchor="middle" x="240" y="35" font-size="16">(parsing of animateTransform values).</text> + <text text-anchor="middle" x="240" y="55" font-size="16">You should see a green square and no red.</text> + <g transform="translate(60,90)"> + <rect fill="red" x="-19" y="-19" width="38" height="38"/> + <g fill="green"> + <animateTransform attributeName="transform" type="rotate" values="450;450;" dur="1s"/> + <rect x="-20" y="-20" width="40" height="40"/> + </g> + </g> +</svg> 
diff --git a/ManualTests/svg-crash-hovering-use.svg b/ManualTests/svg-crash-hovering-use.svg new file mode 100644 index 0000000..029b23b --- /dev/null +++ b/ManualTests/svg-crash-hovering-use.svg 
@@ -0,0 +1,30 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg id="svg" viewBox="0 0 100 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<defs> + <rect id="rect" width="60" height="10"/> +</defs> + +<text x="30" y="30" transform="scale(0.2 0.2)">Hover over the rectangle - it should not crash</text> +<use id="use" x="20" y="10" xlink:href="#rect" /> + +<script> +<![CDATA[ + var svg = document.getElementById("svg"); + var use = document.getElementById("use"); + + function addUseElement() { + svg.appendChild(use, true); + setTimeout(removeUseElement, 50); + } + + function removeUseElement() { + use.parentElement.removeChild(use); + setTimeout(addUseElement, 50); + } + + document.addEventListener("DOMNodeInserted", function() {}, true); + removeUseElement(); +]]> +</script> +</svg> 
diff --git a/ManualTests/svg-css-animate-compound.html b/ManualTests/svg-css-animate-compound.html new file mode 100644 index 0000000..254e541 --- /dev/null +++ b/ManualTests/svg-css-animate-compound.html 
@@ -0,0 +1,82 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>Animation of rotate property</title> +<style type="text/css" media="screen"> + div { + -webkit-box-sizing: border-box; + } +  + .column { + margin: 10px; + display: inline-block; + vertical-align: top; + } + .container { + position: relative; + height: 200px; + width: 200px; + margin: 10px; + background-color: silver; + border: 1px solid black; + } +  + .box { + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 60px; + border: 1px dotted black; + -webkit-transform-origin: top left; /* to match SVG */ + } + + .final { + border: 1px solid blue; + } +  + #target, #ref { + -webkit-animation-name: bounce; + -webkit-animation-duration: 2s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + -webkit-animation-timing-function: ease-in-out; + } +  + @-webkit-keyframes bounce { + from { + transform: translate(0px, 0px) scale(1) rotate(0deg); + } + to { + transform: translate(75px, 25px) scale(2) rotate(45deg); + } + }  +</style> +</head> +<body> + <h1>CSS Animation of 'webkit-transform:' property for SVG</h1> + + <p>The SVG animation should be identical with the CSS one</p> + + <div class="column"> + <h2>SVG compound</h2> + <div class="container"> + <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  + viewBox="0 0 200 200" style="width:200px; height:200px;"> + <rect id="target" x="0" y="0" width="60" height="60" stroke="blue" fill="none"> + </rect> + </svg> + </div> + + <h2>CSS compound</h2> + <div class="container"> + <div class="final box" id="ref"> + </div> + </div> + </div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/svg-css-transition-compound.html b/ManualTests/svg-css-transition-compound.html new file mode 100644 index 0000000..0cd9069 --- /dev/null +++ b/ManualTests/svg-css-transition-compound.html 
@@ -0,0 +1,93 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<title>CSS Transition of SVG elements</title> + +<style type="text/css" media="screen"> + div { + -webkit-box-sizing: border-box; + } +  + .column { + margin: 10px; + display: inline-block; + vertical-align: top; + } + .container { + position: relative; + height: 200px; + width: 200px; + margin: 10px; + background-color: silver; + border: 1px solid black; + } +  + .box { + position: absolute; + top: 0; + left: 0; + height: 60px; + width: 60px; + border: 1px dotted black; + -webkit-transform-origin: top left; /* to match SVG */ + } + + .final { + border: 1px solid blue; + } +  + #target, #ref { + -webkit-transition-property: -webkit-transform; + -webkit-transition-duration: 1s; + }  +</style> + +<script type="text/javascript" charset="utf-8"> + var flag = true; +  + function transition() { + var svgElm = document.getElementById("target"); + var divElm = document.getElementById("ref"); + + if (flag) { + svgElm.style.webkitTransform = "translate(75px, 25px) scale(2) rotate(45deg)"; + divElm.style.webkitTransform = "translate(75px, 25px) scale(2) rotate(45deg)"; + } + else { + svgElm.style.webkitTransform = "translate(0px, 0px) scale(1) rotate(0deg)"; + divElm.style.webkitTransform = "translate(0px, 0px) scale(1) rotate(0deg)"; + } + flag = !flag; + } +</script> +</head> +<body> + <h1>CSS Transition of "-webkit-trasform" property for SVG elements</h1> + + <p>The element below should transition when button is clicked</p>  + <p>The SVG transition should be identical with the CSS one</p> + + <input type="button" value="Transition" onclick="transition()" /> + + <div class="column"> + <h2>SVG compound</h2> + <div class="container"> + <svg xmlns="http://www.w3.org/2000/svg" version="1.1"  + viewBox="0 0 200 200" style="width:200px; height:200px;"> + <rect id="target" x="0" y="0" width="60" height="60" stroke="blue" fill="none"> + </rect> + </svg> + </div> + + <h2>CSS compound</h2> + <div class="container"> + <div class="final box" id="ref"> + </div> + </div> + </div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/svg-cursor-changes.svg b/ManualTests/svg-cursor-changes.svg new file mode 100644 index 0000000..ba7b546 --- /dev/null +++ b/ManualTests/svg-cursor-changes.svg 
@@ -0,0 +1,29 @@ +<svg width="100%" height="100%" viewBox="0 0 300 600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<cursor id="mycursor" x="10" y="10" xlink:href="resources/webkit-background.png"/> + +<!-- Clicking this circle should result in an instant update of the cursor location of this and the next circle (tested using DOM) --> +<circle onclick="document.getElementById('mycursor').setAttribute('x', '100');" cx="80" cy="150" r="70" fill="green" cursor="url(#mycursor)"/> + +<!-- Clicking this circle should result in an instant update of the cursor location of this and the previous circle (tested using SVG DOM) --> +<circle onclick="document.getElementById('mycursor').x.baseVal.value = 100;" cx="230" cy="150" r="70" fill="green" cursor="url(#mycursor)"/> + +<cursor id="mycursor2" x="10" y="10" xlink:href="resources/webkit-background.png"/> +<cursor id="mycursor3" x="10" y="10" xlink:href="resources/webkit-background.png"/> + +<!-- Clicking this circle should result in an instant update of the cursor location (tested using DOM) --> +<circle onclick="document.getElementById('mycursor2').setAttribute('x', '100');" cx="80" cy="310" r="70" fill="green" cursor="url(#mycursor2)"/> + +<!-- Clicking this circle should result in an instant update of the cursor location (tested using SVG DOM) --> +<circle onclick="document.getElementById('mycursor3').x.baseVal.value = 100;" cx="230" cy="310" r="70" fill="green" cursor="url(#mycursor3)"/> + +<cursor id="mycursor4" x="10" y="10" xlink:href="resources/apple.jpg"/> + +<!-- Clicking this circle should result in an instant update of the cursor image (tested using DOM) --> +<circle onclick="document.getElementById('mycursor4').setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', 'resources/webkit-background.png');" cx="80" cy="470" r="70" fill="green" cursor="url(#mycursor4)"/> + +<cursor id="mycursor5" x="10" y="10" xlink:href="resources/apple.jpg"/> + +<!-- Clicking this circle should result in an instant update of the cursor image (tested using SVG DOM) --> +<circle onclick="document.getElementById('mycursor5').href.baseVal = 'resources/webkit-background.png';" cx="230" cy="470" r="70" fill="green" cursor="url(#mycursor5)"/> + +</svg> 
diff --git a/ManualTests/svg-deep-clone-to-new-doc.html b/ManualTests/svg-deep-clone-to-new-doc.html new file mode 100644 index 0000000..faf0ef5 --- /dev/null +++ b/ManualTests/svg-deep-clone-to-new-doc.html 
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + + <!-- To run this test: Open this page, close the window, and (hopefully) don't crash.--> + + <script>  + function gc() + { + if (window.GCController) + GCController.collect(); + else + for (var i = 0; i < 10000; ++i) // Allocate a sufficient number of objects to force a GC. + ({}); + } + window.onload = init; +  + function init() { + var iframe = document.getElementById("iframe"); + var thesvgdiv = document.getElementById('thediv'); + var theclone = thesvgdiv.cloneNode(true); + iframe.contentDocument.body.appendChild(theclone); + setTimeout(function() { + iframe.style.display = 'none'; + iframe.parentNode.removeChild(iframe); + gc(); + window.close(); + }, 500); + } + </script> +</head> + +<body> + <div> + <div id="thediv"> + <svg id="thesvg" width="12cm" height="3.6cm" viewBox="0 0 1000 300">  + <defs> + <lineargradient id="orange_red" x2="0" y2="1" > + <stop stop-color="yellow" /> + <stop offset="1" stop-color="red" /> + </lineargradient> + </defs> + <path id="MyPath" d="M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100" fill="none" stroke="red" />  + <text font-family="Verdana" font-size="72.5" fill="url(#orange_red)" >  + <textpath xlink:href="#MyPath"> Look mom, SVG in HTML! </textpath>  + </text> + (If you had an HTML5 compliant browser, the previous text would be colored and on a path.) + </svg> + </div> + <div> + <iframe id="iframe" width="50%" height="50%"></iframe> + </div> + </div> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/svg-filter-animation.svg b/ManualTests/svg-filter-animation.svg new file mode 100644 index 0000000..4bca5e2 --- /dev/null +++ b/ManualTests/svg-filter-animation.svg 
@@ -0,0 +1,120 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + +<!-- + Copyright (C) 2010 University of Szeged + Copyright (C) 2010 Zoltan Herczeg + Copyright (C) 2010 Gabor Loki + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--> + +<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg"> +<rect x="0%" y="0%" width="100%" height="100%" fill="black" /> + +<defs> +<filter id="filt" filterUnits="objectBoundingBox" x="0" y="0" width="100%" height="100%"> + <feTurbulence baseFrequency="0.03" numOctaves="4" seed="67" result="turb"/> + <feGaussianBlur in="SourceGraphic" primitiveUnits="objectBoundingBox" stdDeviation="1" result="blur"/> + <feComposite in="turb" in2="blur" operator="arithmetic" k2="0.3" k3="1" result="comp"/> + <feDiffuseLighting in="comp" primitiveUnits="objectBoundingBox" diffuseConstant="1" lighting-color="white" surfaceScale="10" result="light" > + <feSpotLight id="light" x="0" y="300" z="200" pointsAtX="-200" pointsAtY="100" pointsAtZ="0" limitingConeAngle="90" specularExponent="20" /> + </feDiffuseLighting> + <feSpecularLighting in="comp" primitiveUnits="objectBoundingBox" diffuseConstant="1" lighting-color="#A66102" surfaceScale="10" result="ambient" > + <feDistantLight azimuth="0" elevation="90" /> + </feSpecularLighting> + <feComposite in="light" in2="ambient" operator="arithmetic" k2="1.2" k3=".8"/> +</filter> +</defs> + +<g filter="url(#filt)" fill="white" stroke="black" onclick="start()"> + <rect x="0" y="0" width="400" height="5" /> + <rect x="0" y="0" width="5" height="200" /> + <rect x="0" y="195" width="400" height="5" /> + <rect x="395" y="0" width="5" height="200" /> + <text font-size="150" font-weight="bold" x="40" y="150">SVG</text> +</g> + +<text id="fps" x="150" y="240" font-size="20" fill="white" stroke="white">afps:</text> +<text x="30" y="265" font-size="20" font-weight="bold" fill="white" stroke="white">click on the image to start the animation</text> + +<script> +<![CDATA[ +var light_x = document.getElementById('light').x; +var light_y = document.getElementById('light').y; +var light_pointsAtX = document.getElementById('light').pointsAtX; +var light_pointsAtY = document.getElementById('light').pointsAtY; +var fps = document.getElementById('fps'); + +var round = Math.round + +var startDate = 0; +var frameCounter = 0; +var phase = 0; +function anim() { + switch(phase) { + case 0: + light_pointsAtX.baseVal += 10; + if (light_pointsAtX.baseVal >= 380) + ++phase; + break; + case 1: + light_x.baseVal += 10; + light_pointsAtX.baseVal -= 10; + if (light_x.baseVal >= 450) { + ++phase; + waitCounter = 0; + } + break; + case 2: + light_y.baseVal -= 5; + if (light_y.baseVal <= -100) + ++phase; + break; + case 3: + light_pointsAtX.baseVal += 10; + if (light_pointsAtX.baseVal >= 450) { + light_x.baseVal = 0; + light_pointsAtX.baseVal = -200; + light_y.baseVal = 300; + light_pointsAtY.baseVal = 100; + phase = 0; + } + break; + } + + frameCounter++; + fps.textContent = "afps: " +(round(frameCounter * 100000 / (new Date() - startDate)) / 100); +} + +function start() { + if (!startDate) { + startDate = new Date(); + setInterval(anim,1); + } +} + +//]]> +</script> + +</svg> 
diff --git a/ManualTests/svg-image-resampling-with-scale.html b/ManualTests/svg-image-resampling-with-scale.html new file mode 100644 index 0000000..4aae6c0 --- /dev/null +++ b/ManualTests/svg-image-resampling-with-scale.html 
@@ -0,0 +1,37 @@ +<!DOCTYPE HTML> +<html> +<head> +<script> +// Image of the Chrome logo. An image with features (i.e., not a green square) is necessary for noticing resampling noise. +var imgSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAADCpJREFUaIHtmXuMHdV9xz/nzNy5+7j78Pqx1/Y+WHbt9QsbkSh1YowJUUIUoQTSPFS1pbRBkDilUqOoSlRSRa1VRbSVWiFDqkBD0iqJBEmpiHARIGIIJcGYxhgw2Iux2di7Xq93vY+79zHn0T/OzNzZu3cfJG3+qHJWs3Pm3jtnvt/f+Z7f4wz8tv22/VpN/G+McfPdD12ZoeGT0s9cZ4XoFcK7qjq8dT0B1ujjWH3WGP1saEo/evTAbaeTH/yqD/817pW/e/e/fS4TBHdJmbkKBFJKBALp+XUeZNFGY63FGA3Woo06rsLSvT88cOuDgPlNEZA3f+Wh27PZxrul53d7vofv+c7ESw4bGdra6MqilSJUCq3UcDksHnjsG3/yAO+SyLshIG7cf7C/sb31oUwm2OP7PhnfAReQEBBLDmmxgLUWrLuy1hIqRRiGqLD8/NR04bbD933xLVYoLW+F4OVH/vS+z2Rb234sPW9TEARIIeY/IWXZ+c+21T9bPQwWYy3GuDuEFChtezw/uK1r1w2nz7x06MRKSKyEgNz3hXvvyOZaH5KezGb8TASL5Bxb1UZEYpBYBzIBnT6MwRiDtgZtDNpYEBJtTRbpf2r9zhtGh4/+58vLkViOgNx9+z/dkW3O3S89ief5RLiIsKasmupHhGLwxpjE2sYad44OHR/aoo3BWFDGYoV/U37n9aPnXn5iSRJLEZDvufWezwbNrd/2PA/peRG4lBSIgBtSVsbJIiKgTXROgJvoc4PWsfWrs6CMG9NYi5CZm9Zt3fvmyLEnX1+MxGIExPZb/mJL0+r8o1J6WSk9N2hidTeaSUvD1IBPWdidTdJXOg0+PQPuewApJdZaZCbz4baubY9efOP5S/WALnTY0ed7PvSxB1959Y1WP+t+YqwFbTEChBBIIxBRX1Dtw0LXlqwN5svOxNKLZnIBCN/HGNOaW9fzILAPCFcyA/LP/vnw59d0rr/T9zNMTEwipZwPKJpiY+y8szYGHV3rSD4qpe/Y2sa6fjyTSzXP87CW7rXb9l4YOfbkUWpuqTcD2ebWjq/6vseVV/Zw7vwIpVIZP1NfbbEFq8Naco0BAxs76N/QAViGzk0yW1IoszhckfyrxpI4Nmqtsbrjqy/DvwDFBfelmrzr/mf2t61df29TQwOeJzh9Zpjjx08ghCATLKY413b15/mjG3dxdX8+SYOShY5lsqA4Oz7H1Jyah0AgkDKSpkifQQonTxWGjF88f9cnrr36PlLRuhZR0JBbtd/3vIT9FT1dDA+fZ3LyMpVySBBkFtDONQZ8+bMfYM+OHs5PlHj61XEuTIUUKxqEoL3Jp73JYyDfzFXdLYzPhAyNFhadEQF4UuBLgZSOjC982tvX7AceAErxb9O6ELd86d7tnb2bvxYEAVIKt0CFIAiynDs3grUWrQ1eimBzY8Df3flhBnvWcejoGC+8OcmlmZCKMslaKRQ1Y1NlTgzPMna5zODGZla3BIzPhFiclQNfks1IGqLD90SEIZKGlIBYO7B55yNPHfr3sUQyKQJeZ9+2mxE1eRmwPr+GfL7TAdKGsFJ1Bl/69PvZsKaNHzz7S06en3ULVhuUMoTKEIbuHH8+NFLg4Z+OIIVgIN9Ee1OGjlyGXINH1pd4cun0bHDnjpvThk8TyARNTdfWehxwmhwc7HceAVCholyqsHtbF7u3dfHYi6OMTJTQ2vn4MAavNKEyqPgcfT86WeLQS6O0NvjkGlaajrlZaGzKXQtk6hLIeNltUsi6vm1Vewvd3V1J2hCGipt2b+bMhTlOvDPtwCuDWmB9nZBRSqOUC2JvDs9ydmyOtsalHUMtgYZs47bFCPgyyG4QUkYZ5cK2Y/tmstks1lryq1q4aiDPCycuOclER2L9UM+TUEwqJqi04djpywS+W6zLNYtTghcEG0g5nzQBGYXMBQlx3IKMx+DgJgA6V+ew1jJ0ftZJIwKp1Hyrh0o7MikiMdnTIwWsZVndJwyqnQR3ev5EEtLjcF+nPOnv6+LMmXfYOZDHWpieC/E9iTGRy4v8uRDz742lF0dubSwXp8pYLIEvKCuWbalMOBnar/cDYy3SCndR45I8T7Jjx1asLWOspaJd+uBLlx95ifutPiWa2KgWIEk1lHbp80pKr1gVtaFjHoG42JBWRMmWwKszu/nODgoz4xgLUgoqyqClQIr4ICERP90SgU/NQCbjMs6KWroMriaAUVK5GIH5BYpIzrVxQQpBQ/sarLX0djbx2tkppHDWl5F8JMyL2PHYxpIkfP0bc+56mTI+zmId+fnfpQnYSrk4mg0yeSmFKyisQFqbpMnpVjGCsZmQbT2tHB2aTMDLVP6ywDjMl9C121YT6qicXBK8u6+iNLOzM6dIqS7thUy5MHNSKY01UWFiqjl7vfbGSJHdgx1ckW+iFGrKSlNSmlJY51CaUmiSfm9nE/0bchTKK5GPs77ShkJhbgTQ9QiomctjLyqta4pvu0B3cXvrYomRqQr7P9aP54kIrKGoNMUEuFlAZl17ljs/2k9FGSpqCeunZWcgDDVjFy68uBiBcOjo04fSZWDtUa8dPjlNMbTc88c76cs311jdgS+mPuvLN/PlWwaREqaLi1s/0bwlKYxCY/mvZx4/RKoySyvVBzpvP/j8T1pa2weygY/nSTxP4EmXZHlRelvbAk+wd3Mr61ozPPvqGEeGJnnp1ETVBVvLezd18N6BVVy3fS0jlysYA03ZRYqkiEBcwYXaUiwrLl6aGPr967dcD1wAVAw6bhqYu3D6te81bP+dv/J9DyEsArevmYZdS6KiLU+fmKJvTZYdfavYu33tPDDxv4mC4rk3p7AWdnTllgQfS1fFBCohJ19/5XvAHCkJ1ZqzAei+/b6fPZfL5TqDwHfWT82CTIqMhZ4mbs1Z6YqYRmfhsakKkwXFbFnjS8EHt7bXtX6y25EEOkslsv7E5ekLf7Bv015gmFRBU5s7V4DJ0VO/+FYlVMlWR5zLJ4V5sglVf10UyoZzkxVeO1/k+C/nGJ4oM1t2RtuyvnEB+LSfj/WutLN8RVnmyiGv/feRbwGTEcak1ZrBAvbkz3789tZ9n7lO+kHe87xEywvgxvE9qsjrzUh6ryeX9djV0zJPguk9pjhGxLKpKMvMXImL4xePfeUPP3I3cImarZV6q8gAtlwunNq49f2fEEIE1SJnYXSKNW6xKb1Xf6tSacLVvTnamvzUPVU36axPFby2FIoVZovlwg8OfmP/228cOwkUau1Yj4AF1PjZ12faNgxMr8r3fcgiEBGJ2GLxtEM1T8Ha1O6dW4ShdrXx+raAzfkmIMqzIEorXGrh3CSE2lBWlrmSYraseOGZx7/+8Df/9gmcfHQt2MXqOQuoMy8/9c6a7i2llnXde8AlaGkr25QVsfOBxxsAxlg8IbjmihayvoysHbvIyMdrCLUlVNaBL4fMlkJeeu7pe+7/2h3fBS5So/3lCBCxDd868sSpju4txZa1PXuMtdGe5fztwqR+sGCTzVlQxhG4Ym0DGzsanLUjmShDtFCdG64oS0lZZosVZkuKo889ec/Bv/zcgzifX4SFS3A5AhYXLMqnjzxxqmVN18WWdb3vM8YGMiru06E+vcUeXyttyPqSnb2tgHCgUxavREc5Aj9dKDE9Vy688NR/HHjgr7/4r8AITveLhuzltgQSEmd/8czp2fHRn6/u27lV+JlO64rUFPCUfAzu5YWxbMo309acSXYkEuCRXEqhoVAKmZ6rMDY2dvzhg1//88e/849PRpZfEjys/B2ZxAW5VUDnDXf+w+9t3PK+W4PGpnUZ38dFbVdCxoWMtZaWRp9r+tsR8cJNeRttLKVQUSor5gqFsRNHf/rdb//N578fAZ/EBatlX/i9q5d8uNSjBVgNrP7gHX//qQ2brvlktrm1TwiB50mklNGOsmVHbxstjZnEzyulqzsXxjI7ffntt175+Y++c+ALj+B8/CVgBjfrK6k0f7XXrEAWaMbNSHvve24cGPzAx/e1rOve1dCQ68w0tfa1NWfo6cxByvrF2am3C4XpC5fOnT125KlHDr9y+LEh4DLO4gWgzP/ha9Z6RAKgEWgCclG/AbfxVJumGFwULeG8yiwuMSviXORv7EV3vTE8HOhM1PfqjG1xrlnjiIRRf0VS+X/b/geyPrDn1efsgAAAAABJRU5ErkJggg=="; + +var intervalId = null; +function doScaleTest() { + var scale = 0.5; + var image1 = document.getElementById('image1'); + var image2 = document.getElementById('image2'); + + image1.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imgSrc); + image2.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', imgSrc); + intervalId = setInterval(function() { + scale += 0.001; + image1.setAttribute('transform', 'scale(' + scale + ') translate(-50 -50)'); + image2.setAttribute('transform', 'rotate(360) scale(' + scale + ') translate(-50 -50)'); + if (scale > 1.3) + window.clearInterval(intervalId); + }, 10); +} +</script> +</head> +<body onload="doScaleTest()"> +Test for crbug.com/151538. This test passes if both Chromium logos smoothly scale up and look identical as they scale.<br/> +<svg width="500" height="500"> + <g transform='translate(100 80)'> + <image id="image1" width="100" height="100"/> + </g> + <g transform="translate(100 220)"> + <image id="image2" width="100" height="100"/> + </g> +</svg> +</body> +</html> 
diff --git a/ManualTests/svg-link-hover-use.svg b/ManualTests/svg-link-hover-use.svg new file mode 100644 index 0000000..53450b3 --- /dev/null +++ b/ManualTests/svg-link-hover-use.svg 
@@ -0,0 +1,9 @@ +<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> + <defs> + <rect id='rect' width='100' height="100" fill='blue' /> + </defs> + <a xlink:href="http://www.webkit.org" > + <use xlink:href="#rect" onmouseover="alert('foo')" /> + </a> + <text y='120' x='10'>The above blue square is a link, the cursor should be a hand above it.</text> +</svg> 
diff --git a/ManualTests/svg-links.svg b/ManualTests/svg-links.svg new file mode 100644 index 0000000..5d0ff0d --- /dev/null +++ b/ManualTests/svg-links.svg 
@@ -0,0 +1,12 @@ +<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> + <a xlink:href='http://www.apple.com' xlink:title='SUCCESS you got a tooltip'> + <rect width='100' height='100' /> + </a> + <text x='10' y='120'> + Try the following with the link above: + <tspan x='10' dy='20'>1. Hover and notice the status text change</tspan> + <tspan x='10' dy='20'>2. Hover and notice the cursor change to a hand</tspan> + <tspan x='10' dy='20'>3. Hover and notice a tooltip appear</tspan> + <tspan x='10' dy='20'>4. Drag the link and notice a bubble appear with the correct URL</tspan> + </text> +</svg> 
diff --git a/ManualTests/svg-modify-deleted-selection.svg b/ManualTests/svg-modify-deleted-selection.svg new file mode 100644 index 0000000..a04aec3 --- /dev/null +++ b/ManualTests/svg-modify-deleted-selection.svg 
@@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg"> +<style> + * { + border-top-style: inset + } +</style> +<script> + window.onclick=function() { + getSelection().setBaseAndExtent(document,5,document,5); + getSelection().deleteFromDocument(); + getSelection().modify('extend','backward','line'); + } +</script> +<text y="50" fill="green" font-size="20">Test passes if no crash on mouse click. Text may be highlighted.</text> +<text> 1 </text> +</svg> 
diff --git a/ManualTests/svg-node-count-vs-scroll.xhtml b/ManualTests/svg-node-count-vs-scroll.xhtml new file mode 100644 index 0000000..1890a53 --- /dev/null +++ b/ManualTests/svg-node-count-vs-scroll.xhtml 
@@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xml:lang="en"> + <head> + <title>SVG Scrolling Performance depends on #node is Safari?</title> + + <script type="text/javascript"> + <![CDATA[ + + var SVG_NS = 'http://www.w3.org/2000/svg'; + + function init() { + var nodeCount = parseInt(prompt('# <rect> to generate? ', 50000)); + + var svgRoot = document.createElementNS(SVG_NS, 'svg'); + + for (var i = 0; i < nodeCount; i++) { + var node = document.createElementNS(SVG_NS, 'rect'); + node.setAttribute('x', i); + node.setAttribute('y', i); + node.setAttribute('width', 1); + node.setAttribute('height', i); + node.setAttribute('fill', 'red'); + + svgRoot.appendChild(node); + } + + svgRoot.style.width = nodeCount + 'px'; + svgRoot.style.height = nodeCount + 'px'; + document.body.appendChild(svgRoot); + } + + ]]> + </script> + </head> + + <body onload="init()"> + <h1>SVG Scrolling Performance depends on #node is Safari?</h1> + </body> +</html> + 
diff --git a/ManualTests/svg-repaint-foreignObject.svg b/ManualTests/svg-repaint-foreignObject.svg new file mode 100644 index 0000000..5c5cad9 --- /dev/null +++ b/ManualTests/svg-repaint-foreignObject.svg 
@@ -0,0 +1,81 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> +  +<script> +<![CDATA[ +var stateIndex = 0; +var currentTarget = 0; + +function stateA()  +{ + document.getElementById("A").textContent = '|A|'; + document.getElementById("B").textContent = 'B'; + + currentTarget = 0; + startAnimation(); +} + +function stateB()  +{ + document.getElementById("A").textContent = 'A'; + document.getElementById("B").textContent = '|B|'; + currentTarget = 1; + startAnimation(); +} + +var intervalId = null; + +function startAnimation() { + if (intervalId == null) { +	intervalId = setInterval(animationStep, 20); + } +} + +function animationStep() { + if (Math.abs(stateIndex - currentTarget) < .001) { +	clearInterval(intervalId); +	intervalId = null; +	return; + } + + if (stateIndex < currentTarget) { +	stateIndex += 1 / 128; + } else { +	stateIndex -= 1 / 128; + } + + var elt = document.getElementById("targetGroup"); + + var transform = "translate(" + (100 * stateIndex) + "," + (100 * stateIndex) + ") rotate(" + (405 * stateIndex) + ",100,250) scale(" + (1 + stateIndex) + ")" ; + var opacity = 1 - .75 * stateIndex; + + elt.setAttribute("opacity", opacity); + elt.setAttribute("transform", transform); +} + + +]]> +</script> + + <text id="A" x="0" y="32" fill="red" font-size="32" onclick="stateA()">|A|</text> + <text id="B" x="60" y="32" fill="blue" font-size="32" onclick="stateB()">B</text> + <text x="0" y="642" fill="black" font-size="32">Click B and then A above.</text> + <text x="0" y="674" fill="black" font-size="32">The animation should have no trails or clipping.</text> + +	<circle fill="pink" cx="300" cy="300" stroke="lightblue" stroke-width="40" r="300" /> + + <g> + <rect fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + + <foreignObject id="targetGroup" x="60" y="60" width="170" height="170" > + <xhtml:xhtml> + <xhtml:img src="http://www.citilink.com/~grizzly/anigifs/3dolph.gif" width="170" height="170" /><br /> + </xhtml:xhtml> + </foreignObject> + </g> + + +</svg> + + 
diff --git a/ManualTests/svg-repaint-group.svg b/ManualTests/svg-repaint-group.svg new file mode 100644 index 0000000..7f0972e --- /dev/null +++ b/ManualTests/svg-repaint-group.svg 
@@ -0,0 +1,81 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> +  +<script> +<![CDATA[ +var stateIndex = 0; +var currentTarget = 0; + +function stateA()  +{ + document.getElementById("A").textContent = '|A|'; + document.getElementById("B").textContent = 'B'; + + currentTarget = 0; + startAnimation(); +} + +function stateB()  +{ + document.getElementById("A").textContent = 'A'; + document.getElementById("B").textContent = '|B|'; + currentTarget = 1; + startAnimation(); +} + +var intervalId = null; + +function startAnimation() { + if (intervalId == null) { +	intervalId = setInterval(animationStep, 20); + } +} + +function animationStep() { + if (Math.abs(stateIndex - currentTarget) < .001) { +	clearInterval(intervalId); +	intervalId = null; +	return; + } + + if (stateIndex < currentTarget) { +	stateIndex += 1 / 128; + } else { +	stateIndex -= 1 / 128; + } + + var elt = document.getElementById("targetGroup"); + + var transform = "translate(" + (100 * stateIndex) + "," + (100 * stateIndex) + ") rotate(" + (405 * stateIndex) + ",100,250) scale(" + (1 + stateIndex) + ")" ; + var opacity = 1 - .75 * stateIndex; + + elt.setAttribute("opacity", opacity); + elt.setAttribute("transform", transform); +} + + +]]> +</script> + + <text id="A" x="0" y="32" fill="red" font-size="32" onclick="stateA()">|A|</text> + <text id="B" x="60" y="32" fill="blue" font-size="32" onclick="stateB()">B</text> + <text x="0" y="642" fill="black" font-size="32">Click B and then A above.</text> + <text x="0" y="674" fill="black" font-size="32">The animation should have no trails or clipping.</text> + +	<circle fill="pink" cx="300" cy="300" stroke="lightblue" stroke-width="40" r="300" /> + + <g id="targetGroup"> + <rect fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + + <foreignObject x="60" y="60" width="170" height="170" > + <xhtml:xhtml> + <xhtml:img src="http://www.citilink.com/~grizzly/anigifs/3dolph.gif" width="170" height="170" /><br /> + </xhtml:xhtml> + </foreignObject> + </g> + + +</svg> + + 
diff --git a/ManualTests/svg-repaint-image.svg b/ManualTests/svg-repaint-image.svg new file mode 100644 index 0000000..018a6a0 --- /dev/null +++ b/ManualTests/svg-repaint-image.svg 
@@ -0,0 +1,77 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> +  +<script> +<![CDATA[ +var stateIndex = 0; +var currentTarget = 0; + +function stateA()  +{ + document.getElementById("A").textContent = '|A|'; + document.getElementById("B").textContent = 'B'; + + currentTarget = 0; + startAnimation(); +} + +function stateB()  +{ + document.getElementById("A").textContent = 'A'; + document.getElementById("B").textContent = '|B|'; + currentTarget = 1; + startAnimation(); +} + +var intervalId = null; + +function startAnimation() { + if (intervalId == null) { +	intervalId = setInterval(animationStep, 20); + } +} + +function animationStep() { + if (Math.abs(stateIndex - currentTarget) < .001) { +	clearInterval(intervalId); +	intervalId = null; +	return; + } + + if (stateIndex < currentTarget) { +	stateIndex += 1 / 128; + } else { +	stateIndex -= 1 / 128; + } + + var elt = document.getElementById("targetGroup"); + + var transform = "translate(" + (100 * stateIndex) + "," + (100 * stateIndex) + ") rotate(" + (405 * stateIndex) + ",100,250) scale(" + (1 + stateIndex) + ")" ; + var opacity = 1 - .75 * stateIndex; + + elt.setAttribute("opacity", opacity); + elt.setAttribute("transform", transform); +} + + +]]> +</script> + + <text id="A" x="0" y="32" fill="red" font-size="32" onclick="stateA()">|A|</text> + <text id="B" x="60" y="32" fill="blue" font-size="32" onclick="stateB()">B</text> + <text x="0" y="642" fill="black" font-size="32">Click B and then A above.</text> + <text x="0" y="674" fill="black" font-size="32">The animation should have no trails or clipping.</text> + +	<circle fill="pink" cx="300" cy="300" stroke="lightblue" stroke-width="40" r="300" /> + + <g> + <rect fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + + <image id="targetGroup" x="60" y="60" width="170" height="170" xlink:href="resources/3dolph.gif" /> + </g> + + +</svg> + + 
diff --git a/ManualTests/svg-repaint-path.svg b/ManualTests/svg-repaint-path.svg new file mode 100644 index 0000000..144e8ae --- /dev/null +++ b/ManualTests/svg-repaint-path.svg 
@@ -0,0 +1,77 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> +  +<script> +<![CDATA[ +var stateIndex = 0; +var currentTarget = 0; + +function stateA()  +{ + document.getElementById("A").textContent = '|A|'; + document.getElementById("B").textContent = 'B'; + + currentTarget = 0; + startAnimation(); +} + +function stateB()  +{ + document.getElementById("A").textContent = 'A'; + document.getElementById("B").textContent = '|B|'; + currentTarget = 1; + startAnimation(); +} + +var intervalId = null; + +function startAnimation() { + if (intervalId == null) { +	intervalId = setInterval(animationStep, 20); + } +} + +function animationStep() { + if (Math.abs(stateIndex - currentTarget) < .001) { +	clearInterval(intervalId); +	intervalId = null; +	return; + } + + if (stateIndex < currentTarget) { +	stateIndex += 1 / 128; + } else { +	stateIndex -= 1 / 128; + } + + var elt = document.getElementById("targetGroup"); + + var transform = "translate(" + (100 * stateIndex) + "," + (100 * stateIndex) + ") rotate(" + (405 * stateIndex) + ",100,250) scale(" + (1 + stateIndex) + ")" ; + var opacity = 1 - .75 * stateIndex; + + elt.setAttribute("opacity", opacity); + elt.setAttribute("transform", transform); +} + + +]]> +</script> + + <text id="A" x="0" y="32" fill="red" font-size="32" onclick="stateA()">|A|</text> + <text id="B" x="60" y="32" fill="blue" font-size="32" onclick="stateB()">B</text> + <text x="0" y="642" fill="black" font-size="32">Click B and then A above.</text> + <text x="0" y="674" fill="black" font-size="32">The animation should have no trails or clipping.</text> + +	<circle fill="pink" cx="300" cy="300" stroke="lightblue" stroke-width="40" r="300" /> + + <g> + <rect id="targetGroup" fill="yellow" stroke="#000000" stroke-width="2" x="60" y="60" width="170" height="170" /> + + <image x="60" y="60" width="170" height="170" xlink:href="resources/3dolph.gif" /> + </g> + + +</svg> + + 
diff --git a/ManualTests/svg-text-float-not-removed-crash.html b/ManualTests/svg-text-float-not-removed-crash.html new file mode 100644 index 0000000..e03937f --- /dev/null +++ b/ManualTests/svg-text-float-not-removed-crash.html 
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<script> +setInterval(function(){ + var elements = document.getElementsByTagName("*"); + var didRemoveElement = false; + for (var i = 0; i < elements.length; i++) { + var element = elements.item(i); + if (!element.firstElementChild && element != document.documentElement) { + didRemoveElement = true; + try {  + element.parentNode.removeChild(element) + } catch(e) { } + } + } + + if (!didRemoveElement) + document.documentElement.innerHTML = "PASS. WebKit didn't crash."; +}, 100); +</script> +<style> +#test1:after { + float: left;  + content: 'A'; +} +</style> +<svg> +<text> +<a id="test1"> +A +</a> +</text> +</svg> +</html> 
diff --git a/ManualTests/svg-text-selection.svg b/ManualTests/svg-text-selection.svg new file mode 100644 index 0000000..4c34d24 --- /dev/null +++ b/ManualTests/svg-text-selection.svg 
@@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:xhtml="http://www.w3.org/1999/xhtml"> + <text x="0" y="100" fill="black" font-size="32">Selection will be constrained to this line.</text> + <text x="0" y="200" fill="black" font-size="32">You should be able + <tspan x="0" y="235">to select multiline here</tspan> + <tspan x="0" y="270">See bug 12334</tspan> + </text> +</svg> 
diff --git a/ManualTests/svg-tooltip.svg b/ManualTests/svg-tooltip.svg new file mode 100644 index 0000000..84fe1d7 --- /dev/null +++ b/ManualTests/svg-tooltip.svg 
@@ -0,0 +1,62 @@ +<?xml version="1.0"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title>This string should not show up as a tooltip</title> + <desc> + This test verifies that tooltips are properly rendered for SVG content in a variety of + scenarios. Hovering over every shape should result in a tooltip of "PASS". + </desc> + <defs> + <ellipse id="e1" cx="100" cy="200" rx="50" ry="30" fill="blue"> + <title>PASS</title> + </ellipse> + <ellipse id="e2" cx="250" cy="200" rx="50" ry="30" fill="blue"> + <title>FAIL</title> + </ellipse> + <symbol id="e3"> + <ellipse cx="100" cy="300" rx="50" ry="30" fill="blue"> + <title>PASS</title> + </ellipse> + </symbol> + <symbol id="e4"> + <title>FAIL</title> + <ellipse cx="250" cy="300" rx="50" ry="30" fill="blue"> + </ellipse> + </symbol> + </defs> + + <text y="15" x="0">When hovered, all shapes should show a "PASS" tooltip. Anything else is a failure.</text> +  + <ellipse cx="100" cy="100" rx="50" ry="30" fill="blue"> + <title>PASS</title> + </ellipse> + + <g> + <title>PASS</title> + <ellipse cx="250" cy="100" rx="50" ry="30" fill="blue"/> + </g> + + <a xlink:title="PASS" xlink:href="#"> + <title>FAIL</title> + <ellipse id="e4" cx="400" cy="100" rx="50" ry="30" fill="blue"/> + </a> +  + <use xlink:href="#e1"/> +  + <use xlink:href="#e2"> + <title>PASS</title> + </use> + + <g> + <title>FAIL</title> + <ellipse id="e8" cx="400" cy="200" rx="50" ry="30" fill="blue"> + <title>PASS</title> + </ellipse> + </g> +  + <use xlink:href="#e3"/> + <use xlink:href="#e4"> + <title>PASS</title> + </use> +  +  +</svg> 
diff --git a/ManualTests/system-color-change.html b/ManualTests/system-color-change.html new file mode 100644 index 0000000..d06f242 --- /dev/null +++ b/ManualTests/system-color-change.html 
@@ -0,0 +1,7 @@ +<body bgcolor="highlight"> +Change the system highlight color. + +On Mac OS X, go into System Preferences and change the Highlight color in the Appearance preference panel. + +If the background of this page changes color immediately, the test passed. +</body> 
diff --git a/ManualTests/tabbing-input-google.html b/ManualTests/tabbing-input-google.html new file mode 100644 index 0000000..6770c11 --- /dev/null +++ b/ManualTests/tabbing-input-google.html 
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8181">8181</a> REGRESSION: After tabbing in page's field, attempting to tab from Google toolbar search to page fails on first try</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b> <br> +1) Place the cursor in the Google search field.<br> +2) Hit tab until focus cycles through the text fields in the page, and comes back to the Google field.<br> +3) Hit tab once. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The first text field in the page should have focus. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The first text field in the page does not have focus. +</p> +<input type="text" value="1"><input type="text" value="2"><input type="text" value="3"> +</body> +</html> 
diff --git a/ManualTests/tap-gesture-in-iframe-with-tap-highlight-crash.html b/ManualTests/tap-gesture-in-iframe-with-tap-highlight-crash.html new file mode 100644 index 0000000..403c303 --- /dev/null +++ b/ManualTests/tap-gesture-in-iframe-with-tap-highlight-crash.html 
@@ -0,0 +1,12 @@ +<html> +<body> + <p>This test verifies that touch gesture on an iframe does not crash when tap highlighting is on.</p> + <p style='color:green'>Tapping on the iframe should not crash.</p> + <iframe src='data:text/html, + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> + <html> + <body style="margin: 0px;"></body> + </html>'> + </iframe> +</body> +</html> 
diff --git a/ManualTests/tap-gesture-on-em-link-tap-highlight-assert.html b/ManualTests/tap-gesture-on-em-link-tap-highlight-assert.html new file mode 100644 index 0000000..ed59249 --- /dev/null +++ b/ManualTests/tap-gesture-on-em-link-tap-highlight-assert.html 
@@ -0,0 +1,7 @@ +<html> +<body> + <p>This test verifies that a link that starts with or contains an em tag does not assert in debug builds.</p> + <p style='color:green'>Tapping on the link should not trigger an assert.</p> + <div><a href="nothing.html"><em>Nothing.</em></a></div> +</body> +</html> 
diff --git a/ManualTests/target-test.html b/ManualTests/target-test.html new file mode 100644 index 0000000..86f6000 --- /dev/null +++ b/ManualTests/target-test.html 
@@ -0,0 +1 @@ +<a href="targeted.html" target="test">Click this link.</a> 
diff --git a/ManualTests/target_new-1.html b/ManualTests/target_new-1.html new file mode 100644 index 0000000..66e16c4 --- /dev/null +++ b/ManualTests/target_new-1.html 
@@ -0,0 +1,11 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"><head> +<body> +<p>Reference the opener, its properties and functions via the links below.</p> +<ol> + +<li>Clicking <a href="#" onclick="alert(window.opener)">here</a> should alert "[object Window]"</li> +<li>Clicking <a href="#" onclick="alert(window.opener.aVar)">here</a> should alert "some value"</li> +<li>Clicking <a href="#" onclick="window.opener.externallyCalled()">here</a> should alert "hello from opener"</li> +</ol> +</body></html> \ No newline at end of file 
diff --git a/ManualTests/target_new.html b/ManualTests/target_new.html new file mode 100644 index 0000000..d7d75b4 --- /dev/null +++ b/ManualTests/target_new.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<script type="text/javascript" language="javascript" charset="utf-8"> + var aVar = "some value"; + function externallyCalled() { +	alert("hello from opener"); + } +</script> +</head> +<body> +<p><b>BUG ID:</b> <a href="rdar://problem/4172380">4172380</a> [GENENTECH] window.opener not available when child opened via target="_new"</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click link below, then click links in the window that opens.</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Links in the new window that opens will alert "[object Window]", "some value", and "hello from opener". +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +First link in the new window that opens will alert "null", and the other two links will not work at all. +</p> + +<a href="target_new-1.html" target="_new">Click this link to begin test</a> +</body> +</html> 
diff --git a/ManualTests/targeted.html b/ManualTests/targeted.html new file mode 100644 index 0000000..16cb18d --- /dev/null +++ b/ManualTests/targeted.html 
@@ -0,0 +1 @@ +This should open in a new window. 
diff --git a/ManualTests/template.html b/ManualTests/template.html new file mode 100644 index 0000000..73fb872 --- /dev/null +++ b/ManualTests/template.html 
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<body> +<p><b>BUG ID:</b> <a href="Bug URL Here">Bug ID Number Here</a> Bug Title Here</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Please describe the steps required to test this bug here. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +Expected results if the test PASSES here. Please describe the results the tester would see if the bug in question is FIXED. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +Expected results if the test FAILS here. Please describe the results the tester would see if the bug in question is NOT FIXED. In many cases, this is just a description of the original bug. +</p> + +Your test code goes here.  + +</body> +</html> 
diff --git a/ManualTests/test-iframes-loading-the-same-resource.html b/ManualTests/test-iframes-loading-the-same-resource.html new file mode 100644 index 0000000..462db02 --- /dev/null +++ b/ManualTests/test-iframes-loading-the-same-resource.html 
@@ -0,0 +1,19 @@ +<html> +<head> +<script> + setTimeout('document.getElementById("frame2").src = "resources/test-frame.html";', 100); + loadCount = 0 + function frame2Loaded() { + if (loadCount < 40) { + setTimeout('document.getElementById("frame2").src = "resources/test-frame.html?'+loadCount+'";', 100); + loadCount++; + }  + } +</script> +</head> +<body> + To perform this test attempt to drag one of the apple images in the left frame while the right frame is doing loads. This test is not entirely deterministic so it should be attempted a number of times. <br /> +<iframe id="frame1" src="resources/test-frame.html"></iframe> +<iframe id="frame2" onload="frame2Loaded();"></iframe> +</body> +</html> 
diff --git a/ManualTests/text-field-autoscroll.html b/ManualTests/text-field-autoscroll.html new file mode 100644 index 0000000..c7848ec --- /dev/null +++ b/ManualTests/text-field-autoscroll.html 
@@ -0,0 +1,23 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8496">Bugzilla #8496</a> REGRESSION: Dragging to select text around a text field causes the text field to scroll</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Start dragging in the text above the text field. Stop where it says "HERE".</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The text field should not autoscroll its text during this drag. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If the text field scrolls, the test has failed. +</p> +Start dragging here....<br> +<input id="tf" value="12345678910 abcdefghijkl 0000000000"><br> +End dragging ............................HERE........watch the text field scroll. +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/textarea-after-stylesheet-link.html b/ManualTests/textarea-after-stylesheet-link.html new file mode 100644 index 0000000..1b88626 --- /dev/null +++ b/ManualTests/textarea-after-stylesheet-link.html 
@@ -0,0 +1,18 @@ +<html> +<head> +<script> +if (window.layoutTestController) { + window.layoutTestController.dumpAsText(); +} +</script> +<link rel="stylesheet" /> +</head> +<body> +<p>Tests: whether &lt;link rel="stylesheet"/&gt; disturbs the display of text in textareas</p> +<p>Related bug: <a href = "http://bugs.webkit.org/show_bug.cgi?id=3751">3751: REGRESSION: affects Blogger, GMail & Wikipedia: empty textarea's which should have content</a></p> +<p>Success: You will see "passed" inside the texarea below</p> +<hr> +<textarea>passed</textarea> +</form> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/textarea-caret-position-after-auto-spell-correct.html b/ManualTests/textarea-caret-position-after-auto-spell-correct.html new file mode 100644 index 0000000..2550c3d --- /dev/null +++ b/ManualTests/textarea-caret-position-after-auto-spell-correct.html 
@@ -0,0 +1,14 @@ +<html>  +<body> +<p>Tests bug <a href="https://bugs.webkit.org/show_bug.cgi?id=26200">26200</a> where the caret position jumps off to an incorrect position after auto-correcting a misspelled word.</p> +<p>Open this file in Google Chromium (version 3.0 +), in Windows, and enable the --auto-spell-correct flag. Insert the word 'teh' between any two words in the paragraph below.</p> +<p>SUCCESS: After hitting space, 'teh' is auto-corrected to 'the', and the caret stays on in the place it is supposed to be in after typing the word and hitting space.</p> +<textarea rows="6" cols="35"> +This is an english statement. +This is an english statement. +This is an english statement. +This is an english statement. +This is an english statement. +</textarea> +</body> +<html> 
diff --git a/ManualTests/textarea-focus.html b/ManualTests/textarea-focus.html new file mode 100644 index 0000000..53afe9e --- /dev/null +++ b/ManualTests/textarea-focus.html 
@@ -0,0 +1,29 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +<style type="text/css"> + textarea { background: red; } + textarea:focus { background: green; } +</style> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=8324">Bugzilla bug 8324</a> REGRESSION: textarea :focus not applied immediately</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +Click in the red text area below. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The text area&rsquo;s background will change from red to green. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The text area will not change to green. Only switching to another window and back to this window +will change it to green. +</p> + +<textarea rows="8" cols="40"></textarea> + +</body> +</html> 
diff --git a/ManualTests/textarea-iframe-navigation.html b/ManualTests/textarea-iframe-navigation.html new file mode 100644 index 0000000..98d0748 --- /dev/null +++ b/ManualTests/textarea-iframe-navigation.html 
@@ -0,0 +1,17 @@ +<html> +<head> +</head> +<body> +<p>Textarea inside iframe -- Navigation</p> + <ol> + <li>In the Debug menu, click "Go to about:blank soon"</li> + <li>Select a few lines in the textarea, keeping the mouse cursor down inside the area</li> + <li>Wait for the navigation to happen</li> + <li>Release the mouse</li> + </ol> +<p>You should not crash.</p> +<hr> +<iframe style="border: 2px solid black" width="100%" src="textarea-iframe-navigation2.html"> +</iframe> +</body> +</html> 
diff --git a/ManualTests/textarea-iframe-navigation2.html b/ManualTests/textarea-iframe-navigation2.html new file mode 100644 index 0000000..74b4964 --- /dev/null +++ b/ManualTests/textarea-iframe-navigation2.html 
@@ -0,0 +1,12 @@ +<html> +<head> +</head> + +<body> +<textarea rows="3"> +a +b +c +</textarea> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/textarea-onpaste.html b/ManualTests/textarea-onpaste.html new file mode 100644 index 0000000..04d98b1 --- /dev/null +++ b/ManualTests/textarea-onpaste.html 
@@ -0,0 +1,9 @@ +<html> + <head> + </head> + <body> + <textarea onpaste="document.getElementById('result').innerHTML='SUCCESS'">Paste here</textarea> + This tests that onpaste handlers are called. To test this, paste some text in the textarea below. The result below should change from FAILURE to SUCCESS. + <div id="result">FAILURE</div>  + </body> +</html> 
diff --git a/ManualTests/textarea-reset-default-value.html b/ManualTests/textarea-reset-default-value.html new file mode 100644 index 0000000..1c747b6 --- /dev/null +++ b/ManualTests/textarea-reset-default-value.html 
@@ -0,0 +1,24 @@ +<html> +<head> +<title>Test for https://bugs.webkit.org/show_bug.cgi?id=31539</title> + +<!-- Manual test for https://bugs.webkit.org/show_bug.cgi?id=31539. + Ensure that the value and defaultValue on a textarea is restored correctly when  + we restore form state (e.g. by hitting back after submitting a form). --> + +</head> +<body> +<h2>Manual test for https://bugs.webkit.org/show_bug.cgi?id=31539.</h2> +<p>To run this test:</p> +<ul> + <li>Change the text in the &lt;textarea&gt; below.</li> + <li>Submit the form. The form should navigate back immediately.</li> + <li>Note that the value in the text area matches what you entered before submitting the form, this is correct.</li> + <li>Now click the reset button for the form. + <li>The text in the &lt;textarea&gt; should now match '123', the default text for the &lt;textarea&gt;.</li> +</ul> + +<iframe src="resources/textarea-form-back-on-submit.html" width="800" height="200" id="frame"></iframe> + +</body> +</html> 
diff --git a/ManualTests/textfield-onblur.html b/ManualTests/textfield-onblur.html new file mode 100644 index 0000000..8f9d7ec --- /dev/null +++ b/ManualTests/textfield-onblur.html 
@@ -0,0 +1,37 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> + <script> + function init () { + document.getElementById("test").focus(); + } + + function foo () { + document.open(); + document.write('Test has passed.'); + document.close(); + } + </script> +</head> +<body onload="init();"> +<p><b>BUG ID:</b> <a href="rdar://problem/4181058">4181058</a> 8C45: Safari repro crash with document.write (WebCore::Node::dispatchEvent)</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +<ul> +<li> Press the Tab key. This will remove focus from the text field, and should call document.write without crashing. +</ul> +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +You should see text that says "Test has passed". +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +If the test fails, the browser will crash. +</p> + +<input type="text" id="test" onblur="foo();" />  + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/timeout-test.html b/ManualTests/timeout-test.html new file mode 100644 index 0000000..2da94a2 --- /dev/null +++ b/ManualTests/timeout-test.html 
@@ -0,0 +1,13 @@ +<html> +<head> +<title>10m10s Timeout Test</title> +</head> +<body> +To run this test, both timeout-test.html and timeout-test.php must be served over http.<br> +And you must be patient.<br> +Clicking on this button will post a form that takes over 10 minutes for the server to respond. The connection should not time out!<br> +<form action="timeout-test.php" method="post"> +<input type="submit" value="Run Test"> +</form> +</body> +</html> 
diff --git a/ManualTests/timeout-test.php b/ManualTests/timeout-test.php new file mode 100644 index 0000000..3c546fe --- /dev/null +++ b/ManualTests/timeout-test.php 
@@ -0,0 +1,3 @@ +<?php +sleep(610) +?>This content took 10m10s to deliver. Congratulations, you didn't time out! 
diff --git a/ManualTests/title-internal-whitespace.html b/ManualTests/title-internal-whitespace.html new file mode 100644 index 0000000..b2cb89e --- /dev/null +++ b/ManualTests/title-internal-whitespace.html 
@@ -0,0 +1,12 @@ +<html> +<head> + <title> + Lorem + Ipsum + Dolor + </title> +</head> +<body> + Title should render as "Lorem Ipsum Dolor" not "Lorem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ipsum&nbsp;&nbsp;&nbsp;&nbsp;Dolor". +</body> +</html> 
diff --git a/ManualTests/touch-stale-iframe-crash.html b/ManualTests/touch-stale-iframe-crash.html new file mode 100644 index 0000000..58751f3 --- /dev/null +++ b/ManualTests/touch-stale-iframe-crash.html 
@@ -0,0 +1,4 @@ +<body> +<iframe id="iframe" src="resources/iframe-reloaded-on-touch.html"></iframe> +This test passes if it doesn't crash. +</body> 
diff --git a/ManualTests/transition-accelerated.html b/ManualTests/transition-accelerated.html new file mode 100644 index 0000000..54ac380 --- /dev/null +++ b/ManualTests/transition-accelerated.html 
@@ -0,0 +1,46 @@ +<!DOCTYPE html> + +<html> +<head> + <style type="text/css" media="screen"> + .box { + position: relative; + height: 100px; + width: 100px; + margin: 10px; + background-color: blue; + } +  + .slow { + -webkit-animation: slow 2s infinite linear alternate; + } +  + .fast { + -webkit-animation: fast 2s infinite linear alternate; + } +  + @-webkit-keyframes slow { + from { + left: 0px; + } + to { + left: 400px; + } + } + + @-webkit-keyframes fast { + from { + transform: translateX(0); + } + to { + transform: translateX(400px); + } + } + </style> +</head> +<body> + <p>The lower box should animate more smoothly than the upper one (on Mac).</p> + <div class="box slow"></div> + <div class="box fast"></div> +</body> +</html> 
diff --git a/ManualTests/transition-delay.html b/ManualTests/transition-delay.html new file mode 100644 index 0000000..03e66d6 --- /dev/null +++ b/ManualTests/transition-delay.html 
@@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Transition Delay</title> + <style> + #container { + position: absolute; + width: 500px; + height: 340px; + border: 1px solid black; + } +  + .box { + position: relative; + width: 100px; + height: 100px; + margin: 10px; + background-color: #66F; + z-index: 0; + } +  + #container.slide > .box { + transform: translateX(380px); + -webkit-transition-property: transform; + -webkit-transition-duration: 2s; + } +  + #box1 { + -webkit-transition-delay: 200ms; + } + + #box2 { + -webkit-transition-delay: 2s; + } + + #box3 { + -webkit-transition-delay: 4s; + } + </style> +  +</head> +<body> +<p>Click to animate</p> +<div id="container" onclick="this.className = 'slide'"> + <div class="box" id="box1"> + Delay: 200ms + </div> + <div class="box" id="box2"> + Delay: 2s + </div> + <div class="box" id="box3"> + Delay: 4s + </div> +</div> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/transition-events.html b/ManualTests/transition-events.html new file mode 100644 index 0000000..36cf940 --- /dev/null +++ b/ManualTests/transition-events.html 
@@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Transition Events</title> + <style type="text/css" media="screen"> + #box1 { + position: relative; + width: 100px; + height: 100px; + margin: 10px; + background-color: blue; + z-index: 0; + -webkit-transition-property: left; + -webkit-transition-duration: 2s; + left: 0px; + } + + #box2 { + position: relative; + width: 100px; + height: 100px; + margin: 10px; + background-color: red; + z-index: 0; + -webkit-transition-property: left; + -webkit-transition-duration: 2s; + left: 0px; + } + + #log { + position: absolute; + width: 90%; + height: 200px; + overflow: scroll; + border: 1px solid black; + } + </style> + <script type="text/javascript" charset="utf-8"> + + var switch1 = true; + var switch2 = false; +  + document.addEventListener('webkitTransitionEnd', function(e) { + var id = "1"; + if (switch1) { + id = "2"; + } + var offset = 200; + if (switch2) { + offset = 0; + } + var box = document.getElementById("box" + id); + box.style.left = "" + offset + "px"; + switch1 = !switch1; + if (!switch1) switch2 = !switch2; + logTransition(event); + }, false); + + function doClick(obj) + { + var box1 = document.getElementById("box1"); + box1.style.left = "200px"; + } + + function logTransition(event) + { + var log = document.getElementById('log'); + log.innerHTML = log.innerHTML + '<br>Property: ' + event.propertyName + ' Time: ' + event.elapsedTime; + } + </script> +</head> +<body> + <h2>Transition Events</h2> + <p>Click to start transitions. Once started, transition end events should keep + things moving forever.</p> + <div id="container" onclick="doClick(this)"> + <div id="box1"> + </div> + <div id="box2"> + </div> + </div> + + <div id="log"> +  + </div> +</body> +</html> 
diff --git a/ManualTests/transition-left.html b/ManualTests/transition-left.html new file mode 100644 index 0000000..492e306 --- /dev/null +++ b/ManualTests/transition-left.html 
@@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> + +<html lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Transition of left property</title> + <style> + div { + position: relative; + left: 100px; + height: 200px; + width: 300px; + background-color: #9bb; + -webkit-transition-property: left; + -webkit-transition-duration: 1s; + } + </style> + <script type="text/javascript" charset="utf-8"> +  + var flag = true; +  + function init() { + document.getElementById("target").addEventListener("click", function(evt) { + if (flag) + evt.target.style.left = "300px"; + else  + evt.target.style.left = "100px"; + flag = !flag; + }, false); + } +  + window.addEventListener("load", init, false); + </script> +</head> +<body> + <h1>Transition of 'left' property</h1> + + <p>The element below should move 200 pixels left or right when clicked</p> +  + <div id="target"> + This element should transition. + </div> + +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/transition-timing-functions.html b/ManualTests/transition-timing-functions.html new file mode 100644 index 0000000..ed1e4d1 --- /dev/null +++ b/ManualTests/transition-timing-functions.html 
@@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html> + <head> + <meta http-equiv="Content-type" content="text/html; charset=utf-8"> + <title>Timing Functions for Transitions</title> + <style type="text/css" media="screen"> +  + body { + margin: 10px; + padding: 0; + } +  + .container div { + position: relative; + width: 250px; + height: 50px; + background: #99c; + -webkit-transition-property: left; + -webkit-transition-duration: 5s; + margin-bottom: 10px; + } +  + .container:hover .default, + .container:hover .ease, + .container:hover .linear, + .container:hover .ease-in, + .container:hover .ease-out, + .container:hover .ease-in-out, + .container:hover .cubic, + .container:hover .error { + left: 400px; + } + + .container .ease { + -webkit-transition-timing-function: ease; + } + + .container .linear { + -webkit-transition-timing-function: linear; + } + + .container .ease-in { + -webkit-transition-timing-function: ease-in; + } + + .container .ease-out { + -webkit-transition-timing-function: ease-out; + } + + .container .ease-in-out { + -webkit-transition-timing-function: ease-in-out; + } + + .container .cubic { + -webkit-transition-timing-function: cubic-bezier(.42, .0, .58, 1.0) + } + + .container .error { + -webkit-transition-timing-function: bananas; + } + + #endmarker { + position: absolute; + width: 10px; + left: 400px; + top: 100px; + height: 500px; + background-color: red; + } + +  + </style> + </head> + <body> + <div id="endmarker"> + </div> + + <h1>Timing functions for transitions</h1> + <p>On hover, the elements below should transition using the + described timing functions</p> +  + <div class="container"> +  + <div class="default"> + Default (no timing function specified, should be the same as Ease) + </div> + + <div class="ease"> + Ease (the default ease function) + </div> + + <div class="linear"> + Linear + </div> + + <div class="ease-in"> + Ease In + </div> + + <div class="ease-out"> + Ease Out + </div> + + <div class="ease-in-out"> + Ease In Out + </div> + + <div class="cubic"> + Cubic bezier specified the same as Ease In Out + </div> + + <div class="error"> + Bogus definition, should become default of Ease + </div> +  + </div> +  +  +  + </body> +</html> \ No newline at end of file 
diff --git a/ManualTests/transitions.html b/ManualTests/transitions.html new file mode 100644 index 0000000..33a9cff --- /dev/null +++ b/ManualTests/transitions.html 
@@ -0,0 +1,54 @@ +<style> + div { + width: 50px; + height: 50px; + background-color: yellow; + } + + div.green { + width: 100px; + background-color: green; + -webkit-transition-property: background-color; + -webkit-transition-duration: 5s; + } + + div.square { + width: 100px; + height: 100px; + -webkit-transition-property: height; + -webkit-transition-duration: 2s; + } +</style> +<p id="instructions"> + When you click the Change button, the shape will + <span id="description"></span>. + <button style="display: block;" onclick="transition()">Change</button> +</p> +<div id="target"></div> +<script> + var state = 0; + var transitions = [ + {className:"green", description:"instantly change into a rectangle and fade from yellow to green over 5 seconds"}, + {className:"", description:"instantly change into a small yellow square"}, + {className:"square", description:"instantly change into a yellow rectangle and then animate into a big yellow square over 2 seconds"}, + {className:"green", description:"instantly change into a yellow rectangle and then animate to a green rectangle over 5 seconds"}, + {className:"", description:"instantly change into a small yellow square"}, + {className:"green", description:"instantly change into a yellow rectangle and fade from yellow to green over 5 seconds"}, + {className:"square", description:"instantly change to a yellow rectangle and then animate into a large yellow square over 2 seconds"}, + {className:"", description:"instantly change into a small yellow square"} + ]; + + document.getElementById("description").innerText = transitions[0].description; + + function transition() + { + var target = document.getElementById("target"); + target.className = transitions[state].className; + state++; + if (state < transitions.length) + document.getElementById("description").innerText = transitions[state].description; + else { + document.getElementById("instructions").innerText = "Done."; + } + } +</script> 
diff --git a/ManualTests/transitions2.html b/ManualTests/transitions2.html new file mode 100644 index 0000000..6515a79 --- /dev/null +++ b/ManualTests/transitions2.html 
@@ -0,0 +1,52 @@ +<style> + div { + width: 50px; + height: 50px; + background-color: green; + } + + div.square { + width: 100px; + height: 100px; + -webkit-transition-property: height; + -webkit-transition-duration: 2s; + } +  + div.rectangle { + width: 100px; + height: 200px; + -webkit-transition-property: width, height; + -webkit-transition-duration: 5s; + } +</style> +<p id="instructions"> + When you click the Change button, the shape will + <span id="description"></span>. + <button style="display: block;" onclick="transition()">Change</button> +</p> +<div id="target"></div> +<script> + var state = 0; + var transitions = [ + {className:"rectangle", description:"animate to a large rectangle over 5 seconds."}, + {className:"square", description:"animate to a square over 2 seconds. Try clicking before the first animation finishes and make sure the width doesn't do an ugly jump."}, + {className:"", description:"instantly change to a small square"}, + {className:"square", description:"instantly change into a small rectangle and then animate into a large square over 2 seconds"}, + {className:"rectangle", description:"animate to a large rectangle over 5 seconds"}, + {className:"", description:"instantly change to a small square"} + ]; + + document.getElementById("description").innerText = transitions[0].description; + + function transition() + { + var target = document.getElementById("target"); + target.className = transitions[state].className; + state++; + if (state < transitions.length) + document.getElementById("description").innerText = transitions[state].description; + else { + document.getElementById("instructions").innerText = "Done."; + } + } +</script> 
diff --git a/ManualTests/typed-array-memory.html b/ManualTests/typed-array-memory.html new file mode 100644 index 0000000..bc8d89e --- /dev/null +++ b/ManualTests/typed-array-memory.html 
@@ -0,0 +1,223 @@ +<html> +<head> +<title>ArrayBuffer External Memory test</title> +<script> + +var log; +function print(message, color) +{ + var paragraph = document.createElement("div"); + paragraph.appendChild(document.createTextNode(message)); + paragraph.style.fontFamily = "monospace"; + if (color) + paragraph.style.color = color; + log.appendChild(paragraph); +} + +function pass(msg) +{ + print("PASS: " + msg, "green"); +} + +function fail(msg) +{ + print("FAIL: " + msg, "red"); +} + +var KB = 1024; +var MB = KB * KB; +var noise = KB; + +function externalMemory() { + return getV8Statistics().amount_of_external_allocated_memory; +} + +function collectGarbage() { + for (var i = 0; i < 10; i++) gc(); +} + +function allocationsThatIncreaseExternalMemory() { + function test(expression) { + var before = externalMemory(); + (function () { eval(expression); }) (); + var now = externalMemory(); + if (now < before + MB - noise) { + fail(expression + " did not increase the amount of external memory (" + + before + ", " + now + ")."); + } else { + pass(expression + " increased the amount of external memory."); + } + collectGarbage(); + var after = externalMemory(); + if (after > now + noise) { + fail("Garbage collection after " + expression + + " did not return the amount of external memory to the initial value (" + + now + ", " + after + ")."); + } else { + pass("Garbage collection after " + expression + + " returned the amount of external memory to the initial value."); + } + } + + test("(new ArrayBuffer(MB))"); + test("(new Float32Array(MB))"); + test("(new Float64Array(MB))"); + test("(new Int8Array(MB))"); + test("(new Int16Array(MB))"); + test("(new Int32Array(MB))"); + test("(new Uint8Array(MB))"); + test("(new Uint16Array(MB))"); + test("(new Uint32Array(MB))"); + var largeJSArray = []; + for (var i = 0; i < MB; i++) largeJSArray.push(i); + test("(new Float32Array(largeJSArray))"); + test("(new Float64Array(largeJSArray))"); + test("(new Int8Array(largeJSArray))"); + test("(new Int16Array(largeJSArray))"); + test("(new Int32Array(largeJSArray))"); + test("(new Uint8Array(largeJSArray))"); + test("(new Uint16Array(largeJSArray))"); + test("(new Uint32Array(largeJSArray))"); + var int8Array = new Int8Array(MB); + test("(new Float32Array(int8Array))"); + test("(new Float64Array(int8Array))"); + test("(new Int8Array(int8Array))"); + test("(new Int16Array(int8Array))"); + test("(new Int32Array(int8Array))"); + test("(new Uint8Array(int8Array))"); + test("(new Uint16Array(int8Array))"); + test("(new Uint32Array(int8Array))"); +} + + +function allocationsThatDoNotChangeExternalMemory() { + function test(expression) { + var before = externalMemory(); + (function () { eval(expression); }) (); + var now = externalMemory(); + if (now > before + noise) { + fail(expression + " increased the amount of external memory (" + before + ", " + now + ")."); + } else { + pass(expression + " did not increase the amount of external memory."); + } + collectGarbage(); + var after = externalMemory(); + if (after < now - noise) { + fail("Garbage collection after " + expression + " decreased the amount of external memory (" + + now + ", " + after + ")."); + } else { + pass("Garbage collection after " + expression + + " did not decrease the amount of external memory."); + } + } + var arrayBuffer = new ArrayBuffer(MB); + test("(new Float32Array(arrayBuffer))"); + test("(new Float64Array(arrayBuffer))"); + test("(new Int8Array(arrayBuffer))"); + test("(new Int16Array(arrayBuffer))"); + test("(new Int32Array(arrayBuffer))"); + test("(new Uint8Array(arrayBuffer))"); + test("(new Uint16Array(arrayBuffer))"); + test("(new Uint32Array(arrayBuffer))"); + var int8Array = new Int8Array(MB); + test("(new Float32Array(int8Array.buffer))"); + test("(new Float64Array(int8Array.buffer))"); + test("(new Int8Array(int8Array.buffer))"); + test("(new Int16Array(int8Array.buffer))"); + test("(new Int32Array(int8Array.buffer))"); + test("(new Uint8Array(int8Array.buffer))"); + test("(new Uint16Array(int8Array.buffer))"); + test("(new Uint32Array(int8Array.buffer))"); +} + + +function transfersThatDecreaseExternalMemory() { + var workerSource = +"function externalMemory() {\n" + +" return getV8Statistics().amount_of_external_allocated_memory;\n" + +"}\n" + +"var KB = 1024;\n" + +"var MB = KB * KB;\n" + +"var noise = KB;\n" + +"self.onmessage = function(e) {\n" + +" var before = externalMemory();\n" + +" e.data;\n" + +" var after = externalMemory();\n" + +" if (after > before + MB - noise) {\n" + +" self.postMessage('PASS: Amount of external memory increased.');\n" + +" } else {\n" + +" self.postMessage('FAIL: Amount of external memory did not increase.');\n" + +" }\n" + +"}\n"; + + var blob = new Blob([workerSource]); + var worker = new Worker(window.webkitURL.createObjectURL(blob)); + worker.onmessage = function (e) { + print("message from worker: " + e.data, "blue"); + } + function test(expression) + { + var buffer = eval(expression); + try { + var before = externalMemory(); + worker.postMessage(buffer, [buffer]); + var now = externalMemory(); + if (now > before - MB + noise) { + fail("Transfer of " + expression + " did not decrease the amount of external memory (" + + before + ", " + now + ")."); + } else { + pass("Transfer of " + expression + " decreased the amount of external memory."); + } + collectGarbage(); + var after = externalMemory(); + if (after < now - noise) { + fail("Garbage collection after transfer of " + expression + + " decreased the amount of external memory (" + now + ", " + after + ")."); + } else { + pass("Garbage collection after transfer of " + expression + + " did not decrease the amount of external memory."); + } + } catch (e) { + fail("Transfer of " + name + ": could not webkitPostMessage: " + e); + return false; + } + return true; + } + test("(new ArrayBuffer(MB))"); + test("(new Float32Array(MB)).buffer"); + test("(new Float64Array(MB)).buffer"); + test("(new Int8Array(MB)).buffer"); + test("(new Int16Array(MB)).buffer"); + test("(new Int32Array(MB)).buffer"); + test("(new Uint8Array(MB)).buffer"); + test("(new Uint16Array(MB)).buffer"); + test("(new Uint32Array(MB)).buffer"); +} + + +function runAll() { + log = document.getElementById("log1"); + if (typeof gc == "undefined" || typeof getV8Statistics == "undefined") { + print("Run chrome browser with --js-flags='--expose_gc --track_gc_object_stats'", "red"); + } else { + allocationsThatIncreaseExternalMemory(); + collectGarbage(); + allocationsThatDoNotChangeExternalMemory(); + collectGarbage(); + log = document.getElementById("log2"); + transfersThatDecreaseExternalMemory(); + collectGarbage(); + } +} + +</script> +</head> +<body onload="runAll()"> +<p>This test checks that allocation and deallocation of typed arrays correctly +adjusts the amount of external memory in V8.</p> +<div id='log1'></div> +<p>This test checks that transfer of an array buffer to worker decreases amount of +external memory in the main V8 isolate.</p> +<div id='log2'></div> +</body> +</html> 
diff --git a/ManualTests/update-empty-popup.html b/ManualTests/update-empty-popup.html new file mode 100644 index 0000000..03462f2 --- /dev/null +++ b/ManualTests/update-empty-popup.html 
@@ -0,0 +1,28 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd"> +<html lang="en"> +<head> +</head> +<body> +<p><b>BUG ID:</b> <a href="http://bugs.webkit.org/show_bug.cgi?id=13379">Bugzilla bug 13379</a> REGRESSION: Cannot add an option to a selected popup</p> + +<p id="test" style="background-color:skyblue; padding:3px;"><b>STEPS TO TEST:</b>  +1. Click on the empty popup button.<br> +2. Click on the Test button. +</p> + +<p id="success" style="background-color:palegreen; padding:3px;"><b>TEST PASS:</b>  +The popup button will change to display the word SUCCESS. +</p> + +<p id="failure" style="background-color:#FF3300; padding:3px;"><b>TEST FAIL:</b>  +The popup button will become wider but will not display any text. Clicking the popup +once will not bring up the menu. +</p> + +<select id="select"></select> +<br> +<input type="button" onclick='document.getElementById("select").add(new Option("SUCCESS"))' value="Test"> + +</body> +</html> 
diff --git a/ManualTests/user-drag-with-decorations.html b/ManualTests/user-drag-with-decorations.html new file mode 100644 index 0000000..1878d11 --- /dev/null +++ b/ManualTests/user-drag-with-decorations.html 
@@ -0,0 +1,7 @@ +This tests that we don't include overflow decorations from our ancestor nodes in the drag image for -webkit-user-drag: element. To perform this test drag the green square below. The drag image should not contain any parts of the scrollbar graphics visible on the page. + +<div style="height:100px; width:100px;overflow:scroll;"> + <div style="-webkit-user-drag:element;position:absolute; background: rgba(0,128,0,0.5); height:100px; width:100px;"> + Drag me! + </div> +</div> \ No newline at end of file 
diff --git a/ManualTests/user-media-request-crash.html b/ManualTests/user-media-request-crash.html new file mode 100644 index 0000000..000f530 --- /dev/null +++ b/ManualTests/user-media-request-crash.html 
@@ -0,0 +1,28 @@ +<html> +<head> +<meta http-equiv="refresh" content="2"/> + +<script> +function error() { +} + +function getUserMedia(dictionary, callback) { + try { + navigator.webkitGetUserMedia(dictionary, callback, error); + } catch (e) { + } +} + +function gotStream1(s) { +} + +function start() { + getUserMedia({audio:true}, gotStream1); +} +</script> + +</head> +<body onload="start()"> +<h1>Test passes if it does not crash.</h1> +</body> +</html> 
diff --git a/ManualTests/video-in-non-frontmost-tab.html b/ManualTests/video-in-non-frontmost-tab.html new file mode 100644 index 0000000..d1fe4a8 --- /dev/null +++ b/ManualTests/video-in-non-frontmost-tab.html 
@@ -0,0 +1,4 @@ +This tests that video does not play if it's not in the frontmost tab. +Command-Click <a href="resources/video-tab.html">this link</a> to open it in a non-frontmost tab. +If you hear music before switching tabs, then the test failed. +If not, click on the tab and the video should then play. 
diff --git a/ManualTests/video-player.html b/ManualTests/video-player.html new file mode 100644 index 0000000..74f0a38 --- /dev/null +++ b/ManualTests/video-player.html 
@@ -0,0 +1,103 @@ +<style> +#videoelem { width: 100%; height: 100%; position: absolute; }  +#videocontainer { position: relative; width: 400px; height:230px;-webkit-user-select:none; -webkit-transition-duration:0.2s} +.videobutton {  + line-height: 40pt; + border: 3px solid white;  + -webkit-border-radius: 20px; + opacity: 0.5; + position: absolute; + font-size: 40pt; + color: white; + background-color: gray; + cursor: pointer; + text-align: center;  + z-index: 1; +} +.videozoombutton { bottom:10px;right:10px;width:1.1em;height:1.1em;font-size:15pt; line-height: 15pt; border:2px solid white; -webkit-border-radius: 8px;} +.videoloading { top: 0; bottom: 0; margin:auto; left:0; right:0; width: 7em; height: 1.2em; cursor:default;} +.videofadeout { -webkit-transition: 1.5s; opacity:0; } +#videocontainer:hover .videofadeout { opacity: 0.5; } +.videoplay { top: 0; bottom: 0; margin:auto; left:0; right:0; width: 1.2em; height: 1.2em;} +</style> +<script> +var videoElem; +var playButton; +var showProgress = true; +var videoLargeSize = false; +function startedPlaying() { + showProgress = false; + playButton.innerHTML = "||" + playButton.className = "videobutton videoplay videofadeout"; +} +function stoppedPlaying() { + playButton.innerHTML = ">" + playButton.className = "videobutton videoplay"; +} +function updateProgress(ev) { + if (!showProgress) + return; + playButton.innerHTML = "Loading..."; + playButton.className = "videobutton videoloading"; +} +function initVideo() { + videoElem = document.getElementById("videoelem"); + playButton = document.getElementById("videoplaybutton"); + videoZoomButton = document.getElementById("videozoombutton"); + if (!videoElem.play) { + playButton.style.display = "none"; + videoZoomButton.style.display = "none"; + return; + } + videoElem.addEventListener("play", startedPlaying); + videoElem.addEventListener("pause", stoppedPlaying); + videoElem.addEventListener("ended", function () { + if (!videoElem.paused) + videoElem.pause(); + stoppedPlaying(); + }); + videoElem.addEventListener("progress", updateProgress); + videoElem.addEventListener("begin", updateProgress); + videoElem.addEventListener("canplaythrough", function () { + videoElem.play(); + }); + videoElem.addEventListener("error", function() { + playButton.innerHTML = "Load failed"; + }); + videoElem.addEventListener("dataunavailable", function () { + if (!showProgress) { + showProgress = true; + playButton.innerHTML = "Loading..."; + playButton.className = "videobutton videoloading"; + } + }); + videoZoomButton.addEventListener("click", function () { + var container = document.getElementById("videocontainer"); + videoLargeSize = !videoLargeSize; + if (videoLargeSize) { + container.style.width = "640px"; + container.style.height = "360px"; + videoZoomButton.innerHTML = "-"; + } else { + container.style.width = "400px"; + container.style.height = "225px"; + videoZoomButton.innerHTML = "+"; + } + }); + playButton.addEventListener("click", function () { + if (videoElem.paused) { + if (!videoElem.src) + videoElem.src = "http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov"; + videoElem.play(); + } else + videoElem.pause(); + } ); +} +</script> +<div id=videocontainer> +<video id=videoelem poster="resources/touch-poster.png"> +<b style="font-size:15pt">This is fallback content. If you had video support you would see some here!</b></video> +<div class="videobutton videoplay" id=videoplaybutton>&gt;</div> +<div id=videozoombutton class="videobutton videozoombutton videofadeout">+</div> +</div> +<script>initVideo();</script> 
diff --git a/ManualTests/video-rtsp.html b/ManualTests/video-rtsp.html new file mode 100644 index 0000000..f500f69 --- /dev/null +++ b/ManualTests/video-rtsp.html 
@@ -0,0 +1,9 @@ +<html> +<head> +<title>RTSP playback test</title> +</head> +<body> +<video width=400 height=300 preload=none autoplay src="rtsp://dmzosx001.dpa.act.gov.au/medium"></video> +<p>Test that RTSP URL loads.<p> +</body> +</html> 
diff --git a/ManualTests/video-statistics.html b/ManualTests/video-statistics.html new file mode 100644 index 0000000..ed9b128 --- /dev/null +++ b/ManualTests/video-statistics.html 
@@ -0,0 +1,79 @@ +<html> +<head><title>WebKit video playback statistics</title></head> +<body> +<!-- inspired by -- + -- http://people.mozilla.org/~cpearce/paint-stats-demo.html --> +<video src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_r640-9cie.mov" id="v" controls autoplay></video> +<div id="log"> + Audio bytes decoded: 0 average p/s: 0<br> + Video bytes decoded: 0 average p/s: 0<br> + Decoded frames: 0 average p/s: 0<br> + Dropped frames: 0 average p/s: 0<br> +</div> +<script> + +var decodedFrames = 0; +var decodedPerSec = 0; +var audioBytesDecoded = 0; +var audioBytesDecodedPerSec = 0; +var videoBytesDecoded = 0; +var videoBytesDecodedPerSec = 0; +var droppedFrames = 0; +var droppedFramesPerSec = 0; + +function Mean() { + this.count = 0; + this.sum = 0; +  + this.record = function(val) { + this.count++; + this.sum += val; + }; +  + this.mean = function() { + return this.count ? (this.sum / this.count).toFixed(3) : 0; + }; +} + + +var decodedMean = new Mean(); +var audioMean = new Mean(); +var videoMean = new Mean(); +var dropMean = new Mean(); + +function recalcRates() { + var v = document.getElementById("v"); + + if (v.readyState <= HTMLMediaElement.HAVE_CURRENT_DATA || v.paused) { + return; + } + + decodedPerSec = (v.webkitDecodedFrameCount - decodedFrames); + decodedFrames = v.webkitDecodedFrameCount; + + audioBytesDecodedPerSec = v.webkitAudioDecodedByteCount - audioBytesDecoded; + audioBytesDecoded = v.webkitAudioDecodedByteCount; + + videoBytesDecodedPerSec = v.webkitVideoDecodedByteCount - videoBytesDecoded; + videoBytesDecoded = v.webkitVideoDecodedByteCount; + + droppedFramesPerSec = v.webkitDroppedFrameCount - droppedFrames; + droppedFrames = v.webkitDroppedFrameCount; + + decodedMean.record(decodedPerSec); + audioMean.record(audioBytesDecodedPerSec); + videoMean.record(videoBytesDecodedPerSec); + dropMean.record(droppedFramesPerSec); +  + var d = document.getElementById("log"); + d.innerHTML = + "Audio bytes decoded: " + v.webkitAudioDecodedByteCount + " average p/s: " + audioMean.mean() + "<br>" + + "Video bytes decoded: " + v.webkitVideoDecodedByteCount + " average p/s: " + videoMean.mean() + "<br>" + + "Decoded frames: " + v.webkitDecodedFrameCount + " average p/s: " + decodedMean.mean() + "<br>" + + "Dropped frames: " + v.webkitDroppedFrameCount + " average p/s: " + dropMean.mean() + "<br>"; +} + +setInterval(recalcRates, 1000); +</script> +</body> +</html> 
diff --git a/ManualTests/video-waiting-seeking.html b/ManualTests/video-waiting-seeking.html new file mode 100644 index 0000000..7509cf6 --- /dev/null +++ b/ManualTests/video-waiting-seeking.html 
@@ -0,0 +1,81 @@ +<html> + <head> + <script src="../../../LayoutTests/media/video-test.js"></script> + <script> + + var seekedCount = 0; + var counter = 0; + + function trySeek(seekTo) + { + if (isInTimeRanges(video.seekable, seekTo)) { + if (isInTimeRanges(video.buffered, seekTo)) { + consoleWrite("Warining: Seeking into buffered region. May not generate waiting or seeking events."); + } + run("video.currentTime = " + seekTo); + } else { + failTest("Cannot seek to " + seekTo + ". Does engine support seeking into unbuffered region?"); + } + } + + function seeked() + {  + ++seekedCount;  + consoleWrite(""); + } + + function scheduleSeek() { + setTimeout(someTimeLater, 200); + } + + function someTimeLater() + { + consoleWrite("Running scheduled seek"); + testExpected("seekedCount", counter); + testExpected("video.currentTime", counter, ">="); + + if (counter == 3) + { + consoleWrite(""); + return; + endTest(); + } + + ++counter; + + scheduleSeek(); + trySeek(counter); + consoleWrite(""); + } + + function start() + { + findMediaElement(); + + waitForEvent('waiting'); + waitForEvent('seeking'); + waitForEvent('seeked', seeked); + waitForEvent('play', someTimeLater); + + consoleWrite("Start Load"); + video.src = "http://127.0.0.1:8000/media/video-throttled-load.cgi?name=../../../media/content/test.mp4&throttle=25"; + video.load(); + video.play(); + } + </script> + </head> + <body onload="start()"> + <video controls></video> + + <p>Attempt to seek out of the buffered range. If supported, this + should cause a waiting and seeking event to be fired for each seek. + This test makes assumptions on the size of the input file, the bitrate + of delivery, and the duration of the file. + </p> + <p> + Source is assumed to be about 188k with a uniform bitrate, &gt; 4 + seconds in length, and served at 25kb/s. This should make seeking one + second ahead every 200ms always leave the buffered region. + </p> + </body> +</html> 
diff --git a/ManualTests/viewport-width-test-after-history-navigation.html b/ManualTests/viewport-width-test-after-history-navigation.html new file mode 100644 index 0000000..4c265bd --- /dev/null +++ b/ManualTests/viewport-width-test-after-history-navigation.html 
@@ -0,0 +1,40 @@ +<html> +<head> + <meta name="viewport" content="width=700"> + <script> + var originalViewportWidth; + + function checkViewportWidthAfterHistoryNavigation() { + if (originalViewportWidth == window.innerWidth) + document.body.innerHTML = "<div style='color:green'>PASS, viewport width is OK after history navigation.</div>"; + else + document.body.innerHTML = "<div style='color:red'>FAIL, viewport width is different after history navigation.</div>"; + } + + function navigateAwayAndBack() { + // Force layout before getting viewport width. + document.body.offsetTop; + originalViewportWidth = window.innerWidth; + + // Assigning to window.location does not create a history entry, so instead link click is simulated. + var evt = document.createEvent("MouseEvents"); + evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + document.getElementById('anchor').dispatchEvent(evt); + // Initiate timer to do final verification as we have navigated back to the cached version of this page. + // This test makes use of the behavior where timers are restored on a cached page. + setTimeout('checkViewportWidthAfterHistoryNavigation()', 1000); + + } + </script> +</head> +<body onload='setTimeout("navigateAwayAndBack()", 0 );'> + <a id='anchor' href='data:text/html, + <html> + <head> + <meta name="viewport" content="width=600"> + </head> + <body onload="document.body.offsetTop; history.back();"></body> + </html>'> + </a> +</body> +</html> 
diff --git a/ManualTests/visited-link-new-window.html b/ManualTests/visited-link-new-window.html new file mode 100644 index 0000000..5e10a34 --- /dev/null +++ b/ManualTests/visited-link-new-window.html 
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> +<head> +<title>Visited link coloring test</test> +<style> +:visited { + color: limegreen; +} +</style> +</head> +<body> +<h1>Visited link coloring test</h1> +<p>Make sure the link below is not colored as visited (delete the item +for visited-link.html from your history and restart if +necessary). Then cmd-click it. The link should turn lime green.</p> +<a href="resources/visited-link.html">Am I a visited link?</a> +</body> +</html> 
diff --git a/ManualTests/webaudio/audiobuffersource-gc.html b/ManualTests/webaudio/audiobuffersource-gc.html new file mode 100644 index 0000000..1d3a294 --- /dev/null +++ b/ManualTests/webaudio/audiobuffersource-gc.html 
@@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>Test GC of AudioBufferSourceNode</title> + <script> + var context; + var bufferLengthSeconds = 120; + var count = 0; + + function runTest() { + + // Create the context + context = new AudioContext(); + + // Continuously create AudioBufferSourceNodes with large AudioBuffers and immediately drop + // the references. This should not crash the browser. + setInterval(function () { + var source = context.createBufferSource(); + var buffer = context.createBuffer(1, bufferLengthSeconds * context.sampleRate, context.sampleRate); + source.buffer = buffer; + buffer = null; + source = null; + ++count; + if ((count % 100) == 0) + console.log(count + " nodes generated"); + }, 10); + } + </script> + </head> + + <body> + <p> + This tests that we clear up source buffers that were never connected nor started. Press the + button to run the test. If everything is working correctly, there will be no crash. Watch the + messages in the console. Run this for at least 5000 nodes (see console for node count). + </p> + <button onclick="runTest()">Run AudioBufferSourceNode GC Test</button> + </body> +</html> 
diff --git a/ManualTests/webaudio/audiobuffersource-loop-grain-no-duration.html b/ManualTests/webaudio/audiobuffersource-loop-grain-no-duration.html new file mode 100644 index 0000000..8d543a3 --- /dev/null +++ b/ManualTests/webaudio/audiobuffersource-loop-grain-no-duration.html 
@@ -0,0 +1,70 @@ +<!doctype html> +<html> + <head> + <title>Loop AudioBufferSourceNode, with buffer set after start</title> + <script> + var context = new AudioContext() || new webkitAudioContext(); + var normalSource; + var delayedSource + var buffer; + var request = new XMLHttpRequest(); + request.open("GET", "../../LayoutTests/webaudio/resources/media/128kbps-44khz.mp3", true); + request.responseType = "arraybuffer"; + request.onload = function() { + context.decodeAudioData(request.response, + function(b) { + buffer = b; + document.getElementById("Start").disabled = false; + document.getElementById("StartDelayed").disabled = false; + }, + function () { + alert("Could not load file"); + }); + }; + request.send(); + + function normalStart() { + console.log("normalStart"); + normalSource = context.createBufferSource(); + normalSource.loop = true; + normalSource.buffer = buffer; + normalSource.connect(context.destination); + normalSource.start(context.currentTime + 2, 0); + } + function delayedStart() { + console.log("delayedStart"); + delayedSource = context.createBufferSource(); + delayedSource.loop = true; + delayedSource.connect(context.destination); + delayedSource.start(context.currentTime + 2, 0); + setTimeout(function () { + delayedSource.buffer = buffer; + }, 1000); + } + </script> + </head> + + <body> + <h1>Loop AudioBufferSourceNode, with buffer set after start</h1> + + <p>Test that looping an AudioBufferSource works correctly if the source is started and the + buffer is assigned later, but before the source would start. This can't be easily tested in an + offline context because we can't precisely control when the assignment of the buffer to the + source is done.</p> + + <p>Press the "Start" button for the normal case where the buffer is assigned before start.</p> + + <p>Press the "Start delayed" button for the case where the source is started and the buffer + assigned later.</p> + + <p>You should hear audio about 2 sec after pressing the button. It should continue until you + press the corresponding Stop button.</p> + + <button id="Start" disabled onclick='normalStart()'>Start</button> + <button id="Stop" onclick="normalSource.stop()">Stop</button> + <br> + <button id="StartDelayed" disabled onclick='delayedStart()'>Start Delayed</button> + <button id="StopDelayed" onclick='delayedSource.stop()'>Stop Delayed Source</button> + + </body> +</html> 
diff --git a/ManualTests/webaudio/audiobuffersource-playbackrate-onended.html b/ManualTests/webaudio/audiobuffersource-playbackrate-onended.html new file mode 100644 index 0000000..edb5dee --- /dev/null +++ b/ManualTests/webaudio/audiobuffersource-playbackrate-onended.html 
@@ -0,0 +1,225 @@ +<!doctype html> +<html> + <head> + <title>Test onended with Different Playback Rates</title> + <style type="text/css"> + header { + margin: 20px 0; + } + #results { + white-space: pre; + font-family: monospace; + } + </style> + </head> + + <body> + <h1>Test onended with Different Playback Rates</h1> + + <p> + Run the following tests in order. In all cases the onended event should be fired. + + See <a href="crbug.com/484935">crbug.com/484935</a>. + </p> + <ol> + <li> + Press "Rate 1" button to test onended with a playback rate of 1. You should hear a sound and + the onended event should be fired, which should print a message to the console and the + Result are below. This audio is the reference. + <p> + The onended event should occur after about <span id="rate-1-duration"></span> sec. + </p> + </li> + <li> + Press "Rate 2" button to do the same test but with the playback rate set to 2. This should + sound somewhat like 1, but have a higher pitch and finish sooner. + <p> + The onended event should occur after about <span id="rate-2-duration"></span> sec. + </p> + </li> + <li> + Press "Rate 1/2" button to do the same test but with the playback rate set to 1/2. This + should sound like 1, but last twice as long with a lower pitch. The entire audio sample + should be played. (Compare with Rate 1.) + + <p> + The onended event should occur after about <span id="rate-half-duration"></span> sec. + </p> + </li> + <li> + Press "Rate variable" button to test playback with a variable playback rate. The entire + sample should be played. Make sure this is distantly different from the other rates + above. If not, then playback automation did not work and a new bug should be filed. + + <p> + The onended event should occur after approximately <span + id="rate-var-min-duration"></span> sec, but may take longer. + </p> + </li> + </ol> + <button id="rate-1" disabled onclick="test1()">Rate 1</button> + <button id="rate-2" disabled onclick="test2()">Rate 2</button> + <button id="rate-half" disabled onclick="testHalf()">Rate 1/2</button> + <button id="rate-var" disabled onclick="testVariable()">Rate variable</button> + + <header>Results</header> + <div id="results"></div> + + <script> + var context = new AudioContext(); + var src; + var buffer; + // Duration (in sec) of the sine source to be used as the test signal. + var duration = 1; + + function generateTestSignal () { + // Create a new test signal. A tone of nominal length |duration|. Near the end, we + // increase the amplitude and then finally fade out the signal. We do this so that we can + // hear when the tone should be ending in case a test fails and the output is clipped + // permaturely. + + // Time from the nominal end where we increase the amplitude + var changeTime = 0.2; + // How fast to fade out the signal. + var timeConstant = 0.2; + + // Create an offline context long enough to hold the nominal tone plus the fade out. + // Somewhat arbitrarily use 5 time constants as the duration of the fade. The signal should + // be small enough that there's not large glitch at the end, but short enough that we don't + // have a long silence at the end. + var contextDuration = duration + timeConstant * 5; + var offline = new OfflineAudioContext(1, contextDuration * context.sampleRate, context.sampleRate); + + var osc = offline.createOscillator(); + var gain = offline.createGain(); + + osc.connect(gain); + gain.connect(offline.destination); + + // Start the tone at amplitude 0.75. + gain.gain.setValueAtTime(.75, 0); + // Gradually increase the gain to 1, a little before the nominal end of the tone. + gain.gain.setTargetAtTime(1, duration - changeTime, timeConstant); + // Now fade out the signal. + gain.gain.setTargetAtTime(0, duration, timeConstant); + osc.start(); + + offline.startRendering().then(function (b) { + buffer = context.createBuffer(1, b.length, context.sampleRate); + buffer.copyToChannel(b.getChannelData(0), 0); + + // Inform user how long the done is. + log("Test signal duration = " + buffer.duration + " sec"); + + // Update the text with the actual lengths so we can compare the expected onended time and + // the actual. + document.getElementById("rate-1-duration").textContent = contextDuration; + document.getElementById("rate-2-duration").textContent = contextDuration / 2; + document.getElementById("rate-half-duration").textContent = contextDuration / 0.5; + + // The factor 1.13 is an approximation of where the onended event should occur. This was + // determined by experimentation because it's pretty hard to calculate the actual duration + // when we automate the playback rate in complicated ways. + document.getElementById("rate-var-min-duration").textContent = 1.13 * contextDuration; + + // Signal generated so we can enable the buttons now. + enableButtons(); + }); + } + + function enableButtons () { + document.getElementById("rate-1").disabled = false; + document.getElementById("rate-2").disabled = false; + document.getElementById("rate-half").disabled = false; + document.getElementById("rate-var").disabled = false; + } + + window.onload = generateTestSignal; + + function createGraph(rate) { + // Create a simple graph with the source connected to the destination and set up the + // playback rate according to |rate|. + + src = context.createBufferSource(); + src.buffer = buffer; + src.playbackRate.value = rate; + src.connect(context.destination); + } + + function test1() { + // Rate 1 test. + createGraph(1); + var startTime = context.currentTime; + src.onended = function () { + log("Rate 1 test ended at " + (context.currentTime - startTime) + " sec"); + } + src.start(); + } + + function test2() { + // Rate 2 test + createGraph(2); + var startTime = context.currentTime; + src.onended = function () { + log("Rate 2 test ended at " + (context.currentTime - startTime) + " sec"); + } + src.start(); + } + + function testHalf() { + // Rate 1/2 test + createGraph(0.5); + var startTime = context.currentTime; + src.onended = function () { + log("Rate 0.5 test ended at " + (context.currentTime - startTime) + " sec"); + } + src.start(); + } + + function testVariable() { + // Variable rate test. Set the nominal playback rate to 0 so that the automation completely + // determines the playback rate. (Otherwise it gets added to the intrinsic playback rate.) + createGraph(0); + + // Create a constant buffer of value 1 that we will automate to generate the desired + // playback rate. + + var gainSrc = context.createBufferSource(); + var gainSrcBuffer = context.createBuffer(1, 1, context.sampleRate); + var d = gainSrcBuffer.getChannelData(0); + d[0] = 1; + gainSrc.buffer = gainSrcBuffer; + gainSrc.loop = true; + + // Automate this gain node to produce the desired playback rate. What we want is to start + // the playback rate at 2, exponentially ramp down to 0.1 at |duration|/2. Then linear ramp + // back up to 1. This will cause the output signal to change pitch and duration. The exact + // modulation is not important except that we want the minimum playback rate to be less than + // 1 to make sure we don't prematurely end the sample causing the onended event not to be + // fired. + var playback = context.createGain(); + playback.gain.setValueAtTime(2, context.currentTime); + playback.gain.exponentialRampToValueAtTime(0.1, context.currentTime + duration / 2); + playback.gain.linearRampToValueAtTime(1, context.currentTime + duration); + + gainSrc.connect(playback); + playback.connect(src.playbackRate); + + gainSrc.start(); + + var startTime = context.currentTime; + src.onended = function () { + log("Rate variable test ended at " + (context.currentTime - startTime) + " sec"); + } + + src.start(); + } + + function log(message) { + console.log(message); + var results = document.getElementById("results"); + results.textContent += message + "\n"; + } + </script> + </body> +</html> 
diff --git a/ManualTests/webaudio/audiobuffersource-resampling-onended.html b/ManualTests/webaudio/audiobuffersource-resampling-onended.html new file mode 100644 index 0000000..7d329e4 --- /dev/null +++ b/ManualTests/webaudio/audiobuffersource-resampling-onended.html 
@@ -0,0 +1,97 @@ +<!doctype html> +<html> + <head> + <title>Test AudioBufferSource.onended</title> + <style type="text/css"> + header { + margin: 20px 0; + } + #results { + white-space: pre; + font-family: monospace; + } + </style> + </head> + + <body> + <h1>Test AudioBufferSource.onended</h1> + + <p>Tests that the onended event is called. This test cannot be run in an offline context + because the onended event is always called.  + </p> + + <p>Press "Test" button to run the test. You should hear two tones, each lasting 1/2 second. If + you do not, the test failed and onended was not correctly fired to generate the second tone. + There should also be messages displayed for each tone played. + </p> + + <button onclick="runTest()">Test</button> + + <header>Results</header> + <div id="results"></div> + + <script> + // This is a slightly modified version of http://jsfiddle.net/ep4zm233/ + + var context = new AudioContext(); + + function runTest() { + log("Starting test"); + + // Create two buffers at a sample rate of 8000. We're assuming 8000 is not the actual + // context sampleRate so that resampling happens during the play back of the buffers. + var bufferRate = 8000; + var bufferSeconds = 0.5; + var bufferFrames = bufferSeconds * bufferRate; + + // The tone buffers at 400Hz and 600 Hz. + var sin400 = context.createBuffer(1, bufferFrames, bufferRate); + var sin600 = context.createBuffer(1, bufferFrames, bufferRate); + + var d400 = sin400.getChannelData(0); + var d600 = sin600.getChannelData(0); + + var omega = 2*Math.PI/bufferRate; + + for (var k = 0; k < bufferFrames; ++k) { + d400[k] = Math.sin(omega * 400 * k); + d600[k] = Math.sin(omega * 600 * k); + } + + var s1 = context.createBufferSource(); + + s1.onended = function () { + // Create a new source using the 600Hz buffer and play it as soon as the onended event for + // s1 has fired. + var s2 = context.createBufferSource(); + s2.connect(context.destination); + s2.buffer = sin600; + s2.start(); + log("Tone 2"); + } + + // Set up the 400 Hz buffer and play it. + s1.buffer = sin400; + + s1.connect(context.destination); + s1.start(); + log("Tone 1"); + } + + function clearResults() { + var results = document.querySelector("#results"); + results.textContent = ""; + } + + function log(message) { + console.log(message); + var results = document.querySelector("#results"); + results.textContent += message + "\n"; + } + </script> + + + + + </body> +</html> 
diff --git a/ManualTests/webaudio/limit-level-0db.html b/ManualTests/webaudio/limit-level-0db.html new file mode 100644 index 0000000..a9a31b4 --- /dev/null +++ b/ManualTests/webaudio/limit-level-0db.html 
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<head> + <title>Test WebAudio Output Clipping</title> + <script> + var context = new AudioContext(); + var gainNode = context.createGain(); + gainNode.connect(context.destination); + gainNode.gain.value = 100; + + var frequency = 1000; + var duration = 1; + + function playNormal() { + // Play a square wave of amplitude 1 (roughly) + var oscillator = context.createOscillator(); + oscillator.frequency.value = frequency; + oscillator.type = 'square'; + oscillator.connect(context.destination); + oscillator.start(); + oscillator.stop(context.currentTime + duration); + } +  + function playLoud() { + // Play a large amplitude sine wave. + var oscillator = context.createOscillator(); + oscillator.frequency.value = frequency; + oscillator.type = 'sine'; + oscillator.connect(gainNode); + oscillator.start(); + oscillator.stop(context.currentTime + duration); + } + + function setText() { + // Set the text correctly with the actual sine amplitude. + document.getElementById("amplitude").textContent = gainNode.gain.value; + } + + window.onload = setText; + </script> +</head> +<body> + <p> + This tests that output audio is clamped to 0db maximum. Press each button below in turn. The + apparent volume for both should be about equal, even though the second button plays with much + higher gain than the first. The resulting waveforms are not equal, however, as the second + button audio is clipped to a square wave shape. + </p> + <p> + The first button plays a square wave with nominal amplitude of 1. That actual amplitude is + slightly less than this because the square wave is band-limited which causes ringing, so the + amplitude is reduced slightly to prevent overflows due to the ringing. + </p> + <p> + The second button plays a very loud sine wave of amplitude <span id="amplitude"></span>. This + is clipped to unit amplitude so it is approximately equal to a square wave. There will be + some buzzing due to the clipping. + </p> + <p> + <strong>WARNING</strong>: Full amplitude signals may be loud. + </p> + <button onclick="playNormal()" title="Normal square wave with nominal amplitude of 1"> + Normal square wave + </button> + <button onclick="playLoud()" title="Loud sine wave that will be clipped to a square wave"> + Loud sine wave (clipped) + </button> +</body> +</html> 
diff --git a/ManualTests/webaudio/suspend-resume-2.html b/ManualTests/webaudio/suspend-resume-2.html new file mode 100644 index 0000000..6a2cd61 --- /dev/null +++ b/ManualTests/webaudio/suspend-resume-2.html 
@@ -0,0 +1,161 @@ +<!doctype html> +<html> + <head> + <title>Test suspend()resume()</title> + <style type="text/css"> + header { + margin: 20px 0; + } + #results { + white-space: pre; + font-family: monospace; + } + </style> + </head> + + <body> + <h1>Test suspend()/resume()</h1> + + <p> + The functionality of suspend()/resume() can't currently be tested with an OfflineAudioContext, + so they need to be tested manually here. + </p> + <p> + You may want to open up a console window to see the messages, in addition to viewing the + messages in the Results area below. + </p> + + <h2>Test 1</h2> + <p> + Test for <a href="crbug.com/483002">issue 483002</a> + </p> + <p> + Perform the following steps + <ol> + <li> + Start Test: you should hear a tone. + </li> + <li> + Run Test: This runs the test. You may press this multiple times. Each press should cause + "suspended" and "running" to be printed out in the Results section below and in the + console. + </li> + <li> + End Test: Press this to end the test and stop the audio. + </li> + </ol> + </p> + <button onclick="test1Start()">Test 1: Start Test</button> + <button onclick="test1Run()">Test 1: Run Test</button> + <button onclick="test1End()">Test 1: End Test</button> + <br></br> + + <h2>Test 2</h2> + <p> + Test for <a href="crbug.com/483269">issue 483269</a> + </p> + <p> + Perform the following steps + <ol> + <li> + Start Test: you should hear a tone. Wait a little bit before proceeding. + </li> + <li> + Run Test: You may press this multiple times. This calls suspend()/resume() multiple times. + The tone should stop momentarily, but restart very quickly. You should still hear the + tone. + </li> + <li> + End Test: Stops the tone. + </li> + </ol> + </p> + <p> + If you do not hear a tone after running the test (but before ending), the test has failed. + </p> + <button onclick="test2Start()">Test 2: Start Test</button> + <button onclick="test2Run()">Test 2: Run Test </button> + <button onclick="test2End()">Test 2: End Test </button> + + <header>Results</header> + <div id="results"></div> + + <script> + var context = new AudioContext(); + var testCount = 0; + var oscillator; + + function test1Start() { + oscillator = context.createOscillator(); + oscillator.connect(context.destination); + oscillator.start(); + log("Test 1 Start"); + } + + function test1Run() { + testCount += 1; + context.suspend().then(function () { + log(context.state, testCount); + return context.resume().then(function () { + log(context.state, testCount); + }, function (e) { + log("Failed to resume context: " + e, testCount); + }); + }, function (e) { + log("Failed to suspend context: " + e, testCount); + }).then(function () {; + log("Test 1 Run: should should be audible"); + }); + } + + function test1End() { + oscillator.stop(); + log("Test 1 End"); + } + + function test2Start() { + if (context.state === "suspended") { + context.resume().then(function () {}, + function (e) { log("Failed to resume context: " + e); }) + } + + oscillator = context.createOscillator(); + oscillator.connect(context.destination); + oscillator.start(); + log("Test 2 Start"); + } + + function test2Run() { + context.suspend(); + context.resume(); + context.suspend(); + context.suspend(); + context.resume().then(function () { + if (context.state === "running") { + log("Test 2 Run: sound should be audible"); + } else { + log("Test 2 Run: FAIL: context not running!"); + } + }); + } + + function test2End() { + oscillator.stop(); + log("Test 2 End"); + } + + function log(message, count) { + var prefix = count + ": "; + + if (count === undefined) + prefix = ""; + else + prefix = count + ": "; + console.log(prefix + message); + var results = document.querySelector("#results"); + results.textContent += prefix + message + "\n"; + } + </script> + + </body> +</html> 
diff --git a/ManualTests/webaudio/suspend-resume.html b/ManualTests/webaudio/suspend-resume.html new file mode 100644 index 0000000..38f1b5e --- /dev/null +++ b/ManualTests/webaudio/suspend-resume.html 
@@ -0,0 +1,129 @@ +<!doctype html> +<html> + <head> + <title>Test suspend/resume</title> + <style type="text/css"> + header { + margin: 20px 0; + } + #results { + white-space: pre; + font-family: monospace; + } + </style> + </head> + + <body> + <h1>Test suspend/resume</h1> + + <p>Press "Start" button to start the test using a single oscillator.</p> + <p>Then press "Suspend" or "Resume" buttons as desired. "Suspend" should stop the audio. + "Resume" should resume the audio immediately.</p> + + <p>Some tests to run:</p> + + <ul> + <li>Suspend/Resume Test + <ol> + <li>Press "Start test"; audio should be heard.</li> + <li>Press "Suspend" multiple times. The first press should stop the audio. Each + subsequent press should do nothing, but the console should show that each press is + resolved successfully. + </li> + <li>Press "Resume". The first press should resume audio immediately. Each subsequent + press should do nothing, but the console should show that each press is resolved + successfully. + </li> + <li>Press "Stop test" to stop the test; audio should stop.</li> + </ol> + </li> + <li>Closed Test + <ol> + <li>Press "Start test"; audio should be heard.</li> + <li>Press "Stop test"; audio should stop</li> + <li>Press "Suspend" or "Resume". Each press should result in a rejected promise + immediately with an error that suspend or resume is invalid on a closed context. + </li> + </ol> + </li> + </ul> +  + <p>See <a href="crbug.com/476429">issue 476429</a></p> + + <button onclick="startTest()">Start test</button> + <button onclick="stopTest()">Stop test</button> + <button onclick="suspend()">Suspend</button> + <button onclick="resume()">Resume</button> + + <header>Results</header> + <div id="results"></div> + + <script> + // This is loosely based on the test from isue 476429. + var context; + var osc; + + var nextSuspendID = 0; + var nextResumeID = 0; + + function startTest() { + try { + context = new AudioContext() || webkitAudioContext(); + } catch (e) { + log("Neither AudioContext nor webkitAudioContext found"); + return; + } + + if (!context.suspend || !context.resume) { + log("AudioContext lacks suspend/resume support"); + return; + } + + osc = context.createOscillator(); + osc.connect(context.destination); + osc.start(); + } + + function suspend() { + var suspendID = nextSuspendID++; + log("suspend request: " + suspendID); + context.suspend() + .then(function() { + log("suspend resolved: " + suspendID); + }, function(e) { + log("suspend rejected: " + suspendID + "; error: " + e); + }); + } + + function resume() { + var resumeID = nextResumeID++; + log("resume request: " + resumeID); + context.resume() + .then(function() { + log("resume resolved: " + resumeID); + }, function(e) { + log("resume rejected: " + resumeID + "; error: " + e); + }); + } + + function stopTest() { + if (context) { + osc.stop(); + osc = null; + context.close() + .then(function() { + log("Context closed."); + }, function(e) { + log("Unable to close context: " + e); + }); + } + } + + function log(message) { + console.log(message); + var results = document.querySelector("#results"); + results.textContent += message + "\n"; + } + </script> + </body> +</html> 
diff --git a/ManualTests/webgl-save-image-as.html b/ManualTests/webgl-save-image-as.html new file mode 100644 index 0000000..30040a7 --- /dev/null +++ b/ManualTests/webgl-save-image-as.html 
@@ -0,0 +1,25 @@ +<!DOCTYPE HTML> +<html> +<script> +var gl; +function runTest() { + if (window.testRunner) + testRunner.waitUntilDone(); + + gl = document.getElementById('canvas').getContext("webgl"); + if (!gl) { + alert("No WebGL context found"); + return; + } + + gl.enable(gl.SCISSOR_TEST); + gl.clearColor(1, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT); +} + +</script> +<body onload='runTest()'> + Right click red square and save image. A red square image should be saved. <br> + <canvas id='canvas' width="100" height="100"></canvas> +</body> +</html> 
diff --git a/ManualTests/whitespace-pre-affinity.html b/ManualTests/whitespace-pre-affinity.html new file mode 100644 index 0000000..eac9040 --- /dev/null +++ b/ManualTests/whitespace-pre-affinity.html 
@@ -0,0 +1,16 @@ +<html> +<body> +<p>This test checks for a regression against http://bugs.webkit.org/show_bug.cgi?id=3739.</p> +NOTES:<ol> +<li>this MUST be checked in a build because the symptom is an assert</li> +<li>double-click a few times on the blanks lines below</li> +<li>if you hit the isEqualIgnoringAffinity() assert, the bug is back</li> +</ol> +<hr> +<pre>One + +Two + +Three</pre> +</body> +</html> 
diff --git a/ManualTests/win/contextmenu-key.html b/ManualTests/win/contextmenu-key.html new file mode 100644 index 0000000..7d6f734 --- /dev/null +++ b/ManualTests/win/contextmenu-key.html 
@@ -0,0 +1,112 @@ +<!DOCTYPE html> +<html> +<head> +<style> + +#outer { + overflow: auto; + width: 200px; + height: 200px; +} + +#inner { + position: relative; + height: 400px; +} + +#inner:focus { + background-color: lightblue; +} + +#inner:active { + background-color: blue; +} + +#h, #h2 { + background: rgba(255, 255, 255, 0); +} + +#h { + position: absolute; + height: 200px; + width: 200px; +} + +#h2 { + position: absolute; + top: 200px; + height: 200px; + width: 100%; +} + +#h:hover, +#h2:hover { + background: pink; +} + +#h:active, +#h2:active { + background: red; +} + +pre { + position: absolute; + left: 250px; + top: 80px; +} + +</style> +</head> +<body> + +<p>Manual test for <a href="https://bugs.webkit.org/show_bug.cgi?id=38129">bug 38129</a></p> + +<p>Click the div below and press the context menu key on your keyboard (Shift+F10 also works)</p> + +<div id=outer> + <div id=inner tabindex=0> + <div id=h2></div> + </div> +</div> + +<div id=h></div> + +<pre></pre> + +<script> + +function cs(el) +{ + if (window.getComputedStyle) + return window.getComputedStyle(el, ''); + return el.currentStyle; +} + +document.addEventListener('contextmenu', function(e) +{ + var inner = document.querySelector('#inner'); + var outer = document.querySelector('#outer'); + var h = document.querySelector('#h'); + var h2 = document.querySelector('#h2'); + var result = []; + + result.push(e.target, document.querySelector('#inner')); + result.push(cs(inner, '').backgroundColor, 'rgb(0, 0, 255)'); + result.push(cs(h, '').backgroundColor, 'rgba(255, 255, 255, 0)'); + result.push(cs(h2, '').backgroundColor, 'rgba(255, 255, 255, 0)'); + + var s = ''; + for (var i = 0; i < result.length; i += 2) { + s += result[i] + ' == ' + result[i + 1] + ' - ' + + (result[i] == result[i + 1] ? 'PASS' : 'FAIL') + '<br>'; + } + + document.querySelector('pre').innerHTML = s; + + return true; +}, false); + +</script> + +</body> +</html> 
diff --git a/ManualTests/win/contextmenu-key2.html b/ManualTests/win/contextmenu-key2.html new file mode 100644 index 0000000..2833e58 --- /dev/null +++ b/ManualTests/win/contextmenu-key2.html 
@@ -0,0 +1,13 @@ +<div oncontextmenu="contextmenu(event)"> +Select some text in the contenteditable below and press the context menu key +(or shift+F10). The browser should not crash. +<div contenteditable id="a"> +<p>|content editable|</p> +</div> +After content editable. +</div> +<script> +function contextmenu(event) { + document.getElementById("a").style.visibility = "hidden"; +} +</script> 
diff --git a/ManualTests/win/contextmenu-key3.html b/ManualTests/win/contextmenu-key3.html new file mode 100644 index 0000000..dc328d7 --- /dev/null +++ b/ManualTests/win/contextmenu-key3.html 
@@ -0,0 +1,8 @@ +<p>Manual test for <a href="https://bugs.webkit.org/show_bug.cgi?id=76421">bug 76421</a></p> +<p>Left click on one of the lines in the text area and then hit the keyboard's context menu key to make sure the context menu pops up for the appropriate line.</p> + +<textarea style="min-height:75px;"> + aaaaaaaaa + bbbbbbbbb + ccccccccc +</textarea> 
diff --git a/ManualTests/win/milliondollar.html b/ManualTests/win/milliondollar.html new file mode 100644 index 0000000..e18baf9 --- /dev/null +++ b/ManualTests/win/milliondollar.html 
@@ -0,0 +1,137 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Million dollar test</title> +<style type="text/css" media="screen"> + body { + padding: 0px; margin: 0px; font-size: 12px; font-family:"Lucida Grande", Verdana, Arial, sans-serif; + background:#303030; + } + .ie {text-align: left; width:1000px;position:relative;visibility:hidden;z-index:1;} + .grid {height: 1000px; width:1000px; position:relative;z-index:153;xoverflow:hidden;} + .row {background:url(100grid_inv.png) #000;height: 100px; text-align: left; position:relative;width:1000px;z-index:10;} + #lq {width:1000px;position:relative;z-index:0;text-align:left;} + .bz {-webkit-perspective: 1500;-webkit-perspective-origin: 50% 325px;} + .fc {-webkit-transform-style: preserve-3d;transform: rotateY(0deg) ;opacity: 1.0;} + @-webkit-keyframes spin_3d { + 0% { transform: rotateY(0) rotateZ(0); } + 33% { transform: rotateY(-20deg) rotateZ(-20deg); } + 65% { transform: rotateY(20deg) rotateZ(20deg); } + 100% { transform: rotateY(0deg) rotateZ(0deg); } + } + .plane > a {display:block;height:100%;width:100%;} + .plane { + position: absolute; + opacity:0.5; + background-repeat:no-repeat; + -webkit-transition: -webkit-transform 0.3s, opacity 0s;-webkit-backface-visibility: visible;} +</style> + +<script type="text/javascript"> +function loadBlocks() { + document.getElementById("ie").style.visibility = "visible"; + document.getElementById("ie").className = document.getElementById("ie").className + " bz"; + document.getElementById("grid").className = document.getElementById("grid").className + " fc"; + document.getElementById("lq").style.display = "none"; + + var cubes; + + cubify(200,0,250,50); + cubify(800,500,900,600); + cubify(250,350,300,400); + cubify(600,600,650,650); + cubify(850,0,900,50); + cubify(650,450,700,500); + cubify(100,500,250,650); + cubify(400,600,500,700); + cubify(700,600,800,700); + cubify(350,0,500,150); + cubify(450,200,500,250); + cubify(550,250,600,300); + cubify(0,400,100,450); + cubify(600,150,650,200); + cubify(600,700,650,750); + cubify(150,850,450,950); + cubify(200,100,300,200); + cubify(750,200,950,400); + cubify(250,700,350,800); + cubify(600,800,700,900); + cubify(100,300,150,350); + cubify(0,300,50,350); + cubify(850,650,950,700); + cubify(900,100,950,150); + cubify(200,400,250,450); + cubify(200,250,250,300); + cubify(300,600,350,650); + cubify(50,200,100,250); + cubify(100,100,150,150); + cubify(0,0,5,5); + cubify(470,430,475,435); + cubify(520,480,525,485); + cubify(570,380,575,385); + cubify(550,0,600,50); + cubify(650,0,700,50); + cubify(425,390,455,400); + cubify(435,400,445,430); + cubify(525,425,530,430); + cubify(450,500,465,515); + cubify(650,100,750,200); + cubify(0,0,50,50); + cubify(700,750,900,800); + cubify(495,390,510,405); + cubify(495,445,500,450); + cubify(560,450,565,455); + cubify(460,460,465,465); + cubify(525,370,530,375); + cubify(490,420,495,425); + cubify(520,440,525,445); + cubify(510,420,515,425); + cubify(495,465,500,470); + cubify(475,405,480,410); + cubify(545,400,550,405); + cubify(485,370,490,375); + cubify(430,365,435,370); + + document.getElementById("grid").innerHTML = cubes + document.getElementById("grid").innerHTML; + + function cubify(x1, y1, x2, y2) + { + var width, height,dw; + width = x2 - x1; + height = y2 - y1; + if (width < height) { + dw = width; + } else { + dw = height; + } + cubes += addBlock(x1,y1,width,height,dw); + } +  + function addBlock(x1,y1,xf,qp,dw) + { + return "<div class='a_cube'><div class='plane one' style='background-color: red;height:"+dw+"px;width:"+dw+"px;top:"+y1+"px;left:"+x1+"px;transform:rotateY(90deg) rotateZ(-90deg) translateX(0px) translateY(-"+(dw/2)+"px) translateZ("+(dw/2)+"px) translateY(0px);position:absolute;'></div><div class='plane two' style='background-color: blue;height:"+dw+"px;width:"+dw+"px;top:"+y1+"px;left:"+x1+"px;transform:rotateY(90deg) rotateX(180deg) rotateZ(-90deg) translateX(0px) translateY(-"+(dw/2)+"px) translateZ("+(dw/2)+"px) translateY(0px);position:absolute;'></div><div class='plane three' style='background-color: green;height:"+dw+"px;width:"+dw+"px;top:"+y1+"px;left:"+x1+"px;transform:rotateX(-90deg) translateX(0px) translateZ("+(dw/2)+"px) translateY(-"+(dw/2)+"px);position:absolute;'></div><div class='plane four' style='background-color: yellow;height:"+dw+"px;width:"+dw+"px;top:"+y1+"px;left:"+x1+"px;transform:rotateY(90deg) rotateX(90deg) rotateZ(-90deg) translateY(-"+(dw/2)+"px) translateX(0px) translateZ("+(dw/2)+"px) translateY(0px);position:absolute;'></div><div class='plane five' style='background-color: gray;height:"+dw+"px;width:"+dw+"px;top:"+y1+"px;left:"+x1+"px;transform:rotateY(0deg) translateX(0px) translateZ("+(dw)+"px) translateY(0px);position:absolute;'></div></div>"; + } + + document.getElementById("grid").style.webkitAnimation = "spin_3d 36s infinite linear"; +}; + +</script> +</head> +<body onload="loadBlocks()"> +<center> + <div id="lq"> + <div style="top: 252px; left: 203px; width: 196px; height: 196px; position: relative; + z-index: 0; text-align: left; border: 0px solid #999; padding: 0px; background: #333; + -moz-border-radius: 0px; -webkit-border-radius: 0px; text-align: center;"> + $1 a pixel + </div> + </div> + <div class="ie" id="ie"> + <div class="grid" id="grid"> + <div class="row" id="row0"></div><div class="row" id="row1"></div><div class="row" id="row2"></div><div class="row" id="row3"></div><div class="row" id="row4"></div><div class="row" id="row5"></div><div class="row" id="row6"></div><div class="row" id="row7"></div><div class="row" id="row8"></div><div class="row" id="row9"></div> + </div> + </div> +</center> +</body> +</html> 
diff --git a/ManualTests/win/select-menu-off-screen.html b/ManualTests/win/select-menu-off-screen.html new file mode 100644 index 0000000..6711b0e --- /dev/null +++ b/ManualTests/win/select-menu-off-screen.html 
@@ -0,0 +1,22 @@ +<html> +<body> + <ol> + <li>Maximize window.</li> + <li>Click on left menu and make sure whole menu (all of the entries should be completely visible) appears on screen against the left edge of the screen.</li> + <li>Click on right menuand make sure whole menu (all of the entries should be completely visible) appears on screen against the right edge of the screen.</li> + </ol> + <select id="left-select-over" style="margin-left:-50px;"> + <option value="first">First</option> + <option value="second">Second</option> + <option value="third">Third</option> + <option value="fourth">Fourth</option> + </select> + <select id="right-select-over" style="float:right; margin-right:-50px;"> + <option value="first">First</option> + <option value="second">Second</option> + <option value="third">Third</option> + <option value="fourth">Fourth</option> + </select> +</body> +<html> + 
diff --git a/ManualTests/window-close-during-parsing.html b/ManualTests/window-close-during-parsing.html new file mode 100644 index 0000000..70dfef4 --- /dev/null +++ b/ManualTests/window-close-during-parsing.html 
@@ -0,0 +1,18 @@ +<html> +<body> +<p>This test checks a window.close called in the midst of parsing a page. + Click the buttons below to load the test pages. +</p> +<hr> +<input type=button value="Run Test 1" onclick='window.open("resources/window-close-during-parsing-popup1.html")'> +<p>If this test passes, you should see 'PASS: same script tag after close,' + but nothing else. In particular, you should not see onload or onunload  + fire. +</p> +<hr> +<input type=button value="Run Test 2" onclick='window.open("resources/window-close-during-parsing-popup2.html")'> +<p>If this test passes, you should see a window open and then close. + If it fails, Safari will crash. +</p> +</body> +</html> 
diff --git a/ManualTests/window-geometry.html b/ManualTests/window-geometry.html new file mode 100644 index 0000000..5819fe4 --- /dev/null +++ b/ManualTests/window-geometry.html 
@@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<head> +</head> +<script> + +function setWindowRect(win, clientRect, fromWindow) { + if (win) { + var desktopLeft = fromWindow.screenLeft - fromWindow.screen.availLeft; + var desktopTop = fromWindow.screenTop - fromWindow.screen.availTop; + + win.moveTo(clientRect.left + desktopLeft, clientRect.top + desktopTop); + win.resizeTo(clientRect.width, clientRect.height); + } +} + +function createEqual(div, fromWindow) { + win = window.open("about:blank", "", "location=no, resizable=no, scrollbars=no, status=no, titlebar=no, toolbar=no, left=0, top=0, width=1, height=1"); + win.document.write("<style>body { margin: 0 }</style><body></body>"); + win.document.getElementsByTagName('body')[0].innerHTML = div.outerHTML; + setWindowRect(win, div.getClientRects()[0], fromWindow); + return win; +} + +var window1; +var window2; + +function runTests() { + var div1 = document.getElementsByTagName('div')[1]; + var div2 = document.getElementsByTagName('div')[2]; + + window1 = createEqual(div1, window); + window2 = createEqual(div2, window); + + window.onscroll = function() { + setWindowRect(window1, div1.getClientRects()[0], window); + setWindowRect(window2, div2.getClientRects()[0], window); + } + + start = Date.now(); + sign = 1; + + function step(timestamp) { + var progress = timestamp - start; + var before = document.body.scrollTop; + window.scrollBy(0, 10 * sign); + if (before == document.body.scrollTop) { + sign = sign * -1; + } + + requestAnimationFrame(step); + } + scrollTo(0, 0); + requestAnimationFrame(step); +} + +function endTests() { + window1.close(); + window2.close(); +} +</script> +<body onload="runTests()" onunload="endTests()"> + <div style="height: 1000px"></div> + <div style="background-color: red; width: 400px; height: 100px;"></div> + <br> + <div style="background-color: blue; width: 200px; height: 200px; float: right"></div> + <div style="height: 1000px"></div> +</body> +</html> 
diff --git a/ManualTests/window-open-features-parsing.html b/ManualTests/window-open-features-parsing.html new file mode 100644 index 0000000..50dc5e8 --- /dev/null +++ b/ManualTests/window-open-features-parsing.html 
@@ -0,0 +1,38 @@ +<html><head><script> +function test() { + /* The lowdown on this feature string: + - ,=\twidth: reads as key:width value:0200px|0, which, after strtol/toInt, gives you 200 + - =height: reads as key:height value:"", which means yes, which means 1, but the minimum size is 100, so 100 + - 1width: reads as key:1width, an invalid key, so it doesn't override the previous width + - left: reads as key:left value:no, which means 0, which means aligned to the left side of the screen + - \ntoolBAR: reads as key:toolbar value:yes + - \rstatus: reads as key:status value:"", which means yes + - the trailing comma catches a previous mistake i made reading past the end of the string + */  + var sFeatures = "	,=\twidth ==	= =	0200px|0=height 400,1width=400,left=nO \ntoolBAR=yeS,resizable=yess, \rstatus= ,";  + var w = window.open("resources/popup200x100.html", undefined, sFeatures);  + w.focus(); +} +</script></head> +<body> +<p>This test checks whether parsing of the 'features' argument to window.open matches  +Win IE's behavior, except in the case of "resizable," which should always be true.</p> +<p>The link below should open a window with the following attributes:</p> +<ul> +<li> A WebView exactly 200x100, such that you can see a red 1 pixel border along each edge of the WebView. +<li> A window aligned to the left hand side of the screen. +<li> Toolbar visible. +<li> Statusbar visible. +<li> Resizable. +</ul> +<a href="" onclick="test(); return false;">Click to test</a> +<hr> +<p>The link below should open a window with the following attributes:</p> +<ul> +<li>A window whose size matches what you would get from file->New Window.</li> +<li>A window whose positioning matches what you would get from file->New Window.</li> +<li>Statusbar visible.</li> +<li>Resizable.</li> +</ul> +<a href="" onclick='window.open("", "", "status,resizable");'>Click to test</a> +</body></html> 
diff --git a/ManualTests/window-print-subframe.html b/ManualTests/window-print-subframe.html new file mode 100644 index 0000000..39047b3 --- /dev/null +++ b/ManualTests/window-print-subframe.html 
@@ -0,0 +1,5 @@ +<script> + window.onload = function() { frames[0].print(); } +</script> +<p>This text in the main frame should not be printed.</p> +<iframe src="resources/print-subframe.html"> 
diff --git a/ManualTests/window-sizing.html b/ManualTests/window-sizing.html new file mode 100644 index 0000000..572998b --- /dev/null +++ b/ManualTests/window-sizing.html 
@@ -0,0 +1,126 @@ +<html> +<head> +<script> +var w; +function Open(sFeatures) +{ + if (w && !w.closed) +	w.close(); +  + w = window.open("resources/popup200x200.html", "popup", sFeatures); + +} + +function test1() +{ + Open("width=200, height=200, left = 0, top = 0, scrollbars, resizable"); + + setConsole(document.getElementById('console1')); + clearConsole(); + shouldBe("w.innerHeight", 200); + shouldBe("w.innerWidth", 200); + shouldBe("w.outerWidth", 200); + shouldBe("w.screenLeft", 0); + shouldBe("w.screenTop", 22); // empirical result of low dpi testing + shouldBe("w.outerHeight", 223); // empirical result of low dpi testing +} + +function test2() +{ + console = document.getElementById('console2'); + Open("width=200, height=200, left = 0, top = 0, scrollbars, menubar, status, toolbar, resizable"); + + setConsole(document.getElementById('console2')); + clearConsole(); + shouldBe("w.innerHeight", 200); + shouldBe("w.innerWidth", 200); + shouldBe("w.outerWidth", 200); + shouldBe("w.screenLeft", 0); + shouldBe("w.screenTop", 22); // empirical result of low dpi testing + shouldBe("w.outerHeight", 313); // empirical result of low dpi testing +} + +function test3() +{ + Open("width=200,height=200,left=" + (screen.width - 200) + ",screenY=0, resizable"); + w.moveBy(0, screen.height - w.screenTop - w.outerHeight); + + // should be no-ops + w.moveTo(w.screenLeft - 100, w.screenTop + 100); + w.moveBy(100, -100); + w.resizeTo(w.outerWidth - 100 , w.outerHeight - 100); + w.resizeBy(100, 100); + + setConsole(document.getElementById('console3')); + clearConsole(); + shouldBe("w.innerHeight", 200); + shouldBe("w.innerWidth", 200); + shouldBe("w.outerWidth", 200); + shouldBe("w.screenLeft", screen.width - 200); + shouldBe("w.screenTop", screen.height - w.outerHeight); + shouldBe("w.outerHeight", 223); // empirical result of low dpi testing +} + +var console; +function print(message, color)  +{ + var paragraph = document.createElement("div"); + paragraph.appendChild(document.createTextNode(message)); + paragraph.style.fontFamily = "monospace"; + if (color) + paragraph.style.color = color; + console.appendChild(paragraph); +} + +function clearConsole() +{ + console.innerHTML = ""; +} + +function setConsole(c) +{ + console = c; +} + +function shouldBe(a, b) +{ + var evalA = eval(a); + if (evalA == b) + print("PASS: " + a + " should be " + b + " and is.", "green"); + else + print("FAIL: " + a + " should be " + b + " but instead is " + evalA + ".", "red"); +} +</script> +</head> +<body> + +<p>This test checks our support for window sizing and positioning.</p> +<p>To test: Click each button below. Check to make sure that the window it opens has the specified attributes. + Also check for a series of 'PASS' messages below the button.</p> +<p style="color:red">NOTE: Make sure to test at magnified resolutions.</p> +<p>To test @ 2X resolution:</p> +<ol> +<li>Open Quartz Debug (/Developer/Applications/Performance Tools).</li> +<li>Select Tools -> Show User Interface Resolution.</li> +<li>Set the resolution to 2.0.</li> +<li>Restart Safari.</li> +</ol> +<hr> + +<p>Window size (no toolbars): You should see a red 1 pixel border along every edge of this page, and no scrollbars.</p> +<input type="button" value="open it!" onclick="test1()"> +<div id='console1'></div> +<hr> + +<p>Window size (all toolbars): You should see a red 1 pixel border along every edge of this page, and no scrollbars.</p> +<input type="button" value="open it!" onclick="test2()"> +<div id='console2'></div> +<hr> + +<p>Window positioning: This window should be aligned exactly to the bottom right corner of the screen.</p> +<input type="button" value="open it!" onclick="test3()"> +<div id='console3'></div> +<hr> + +</body> +</html> 
diff --git a/ManualTests/word-spacing-highlight.html b/ManualTests/word-spacing-highlight.html new file mode 100644 index 0000000..01b69f9 --- /dev/null +++ b/ManualTests/word-spacing-highlight.html 
@@ -0,0 +1,15 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  +"http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<title>Highlighting with word spacing</title> +</head> +<body> +<p style="word-spacing:5em;"> +M xylophone +</p> +<p style="margin-left:1em;"> +&#x2191; click there and drag to the right +</p> +</body> +</html> \ No newline at end of file 
diff --git a/ManualTests/wordXML-selectall.xml b/ManualTests/wordXML-selectall.xml new file mode 100644 index 0000000..900311b --- /dev/null +++ b/ManualTests/wordXML-selectall.xml 
@@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<?mso-application progid="Word.Document"?> +<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/2/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:SL="http://schemas.microsoft.com/schemaLibrary/2003/2/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/2/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" xml:space="preserve"><o:DocumentProperties></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/></w:fonts><w:docPr></w:docPr><w:body><wx:sect><w:p><w:pPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Helvetica" w:h-ansi="Helvetica" w:cs="Helvetica"/><wx:font wx:val="Helvetica"/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr><w:t>Simply open this document and "Select all" (cmd-a). That was enough to crash. See &lt;rdar://problem/4214259&gt;.</w:t></w:r></w:p><w:sectPr><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file 
diff --git a/ManualTests/write-after-open.html b/ManualTests/write-after-open.html new file mode 100644 index 0000000..e4c2f4b --- /dev/null +++ b/ManualTests/write-after-open.html 
@@ -0,0 +1,42 @@ +<html> +<body> +<script> +i = 0; +windowArgs = "top=100, left=100, height=200, width=200"; +windowName = ""; + +w = window.open("", windowName + i++, windowArgs); +w.document.write("PASS: document.write after window.open(\"\", ...) worked."); +w.document.close(); + +w = window.open("", windowName + i++, windowArgs); +w.document.open(); +w.document.write("PASS: document.write after window.open(\"\", ...) worked."); +w.document.close(); + + +w = window.open("about:blank", windowName + i++, windowArgs); +w.document.write("PASS: document.write after window.open(\"about:blank\", ...) worked."); +w.document.close(); + +w = window.open("about:blank", windowName + i++, windowArgs); +w.document.open(); +w.document.write("PASS: document.write after window.open(\"about:blank\", ...) worked."); +w.document.close(); + + +w = window.open("resources/write-after-open-popup.html", windowName + i++, windowArgs); +w.document.write("PASS: document.write after window.open(\"resources/write-after-open-popup.html\", ...) worked."); +w.document.close(); + +w = window.open("resources/write-after-open-popup.html", windowName + i++, windowArgs); +w.document.open(); +w.document.write("PASS: document.write after window.open(\"resources/write-after-open-popup.html\", ...) worked."); +w.document.close(); +</script> + +<p>This test checks for regression against: <rdar://problem/3461547> can't use document.writeln() on windows opened via window.open("about:blank") in same function. </p> + +<p>On success, 6 windows will open, one on top of the other, each containing a PASS message.</p> +</body> +</html> 
diff --git a/ManualTests/xhr-failure-behind-alert.html b/ManualTests/xhr-failure-behind-alert.html new file mode 100644 index 0000000..23b2a83 --- /dev/null +++ b/ManualTests/xhr-failure-behind-alert.html 
@@ -0,0 +1,10 @@ +Connecting to a server that doesn't respond. +Run this from a local file to avoid cross-origin code path. + +<script> +var req = new XMLHttpRequest; +req.open("GET", "http://127.0.0.1:7", true); +req.send(); +req.onerror = function() { document.write("onerror<br>"); } +alert("PASSED if no crash or assertion failure"); +</script> 
diff --git a/ManualTests/zh-font-fallback-android.html b/ManualTests/zh-font-fallback-android.html new file mode 100644 index 0000000..fdd7d01 --- /dev/null +++ b/ManualTests/zh-font-fallback-android.html 
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<style> +.test { font-size: 30px; } +</style> +<div lang="zh-CN">lang=zh-CN: <span class="test">&#x8AA4;&#x904E;&#x9AA8;</span></div> +<div lang="zh-TW">lang=zh-TW: <span class="test">&#x8AA4;&#x904E;&#x9AA8;</span></div> +<div lang="en">lang=en: <span class="test">&#x8AA4;&#x904E;&#x9AA8;</span></div> +<div>no lang: <span class="test">&#x8AA4;&#x904E;&#x9AA8;</span></div> +<h2>Expected results:</h2> +<div>On Android Lollipop when system locale is not zh-TW or zh-HK,<br> +or on previous Android releases regardless of system locale:</div> +<img src="resources/zh-hans.png"> +<div>On Android Lollipop when system locale is zh-TW or zh-HK:</div> +<img src="resources/zh-hant.png"> +